idci/contact-form-bundle
A Symfony bundle that provides a ready-to-use contact form for your application, handling form building, submission and email delivery so you can add a configurable contact page with minimal setup and customization.
Framing for a TPM. The first job is to correct the premise: this is not a Laravel package. idci/contact-form-bundle is a Symfony2 bundle (roughly the 2.1–2.3 era), registered through AppKernel.php and the Symfony bundle contract. On a Laravel roadmap there is no adoption decision to make — there is only a reuse-as-reference decision. A TPM's leverage here is not integration management; it is (a) converting an abandoned artifact into a requirements spec, (b) killing the dependency question cheaply and permanently, and (c) protecting the delivery estimate from being contaminated by a port that will not converge.
Architecture fit — none, and not rescuable. The package's value lives entirely in its Symfony wiring: dependency-injection extensions, Resources/config/services.yml, annotation routing, Symfony Form types, Twig templates. Laravel has no bundle, no kernel, no container compiler pass to hook into. Stripping the wiring leaves a form type, a mailer call, and a template — all of which are hours of native work, not days of porting. The "social sharing" half is separate scope with a different lifecycle (share endpoints have degraded materially since this bundle's era) and should not ride along on the contact-form decision.
Integration feasibility — zero for code, high for requirements. There is no adapter seam worth building. The productive path is to treat the repository as a field-and-validation reference: read the form type for field set and constraints, read the templates for copy structure and error presentation, then discard the code.
Technical risk — elevated and asymmetric, because the cost lands after delivery.
Key questions for the requestor — these are the TPM's actual deliverable.
Recommendation: reject for adoption; retain as reference material. Record the rejection so the question is not re-litigated.
Stack fit. There is none, and the native equivalents are stronger than the bundle on every axis: Blade plus FormRequest validation, a Mailable over the Mail facade with queue-backed delivery, CSRF middleware, throttling, and either a honeypot package or a maintained CAPTCHA/Altcha integration for spam. Every capability the bundle advertises is first-party in Laravel or covered by an actively maintained package.
Migration path — the word is wrong; this is a rewrite with a reference. The defensible sequence:
composer require idci/contact-form-bundle against the target Laravel version and capture the resolver failure verbatim. Output is a one-paragraph decision record, not a prototype. Pre-agree the kill criterion: any Composer conflict on symfony/* or php is terminal.FormRequest, Mailable, queued job, honeypot plus per-IP throttle, consent/retention handling, accessibility pass on labels and error messages.vendor/ or a fork branch. That is how a three-day feature acquires a permanent maintenance line item.Compatibility. Three independent hard blocks, any one sufficient: the PHP version ceiling, the Symfony 2.x framework dependency, and the Twig/Swiftmailer transitive tree. There is no shim that resolves these without forking the framework itself, so do not fund a compatibility investigation.
Sequencing for a TPM. Run the spike in parallel with the native build, never ahead of it — the spike cannot produce information that changes the plan, so it must not sit on the critical path. Gate any further evaluation behind the pre-agreed kill criterion. If a genuine Symfony target surfaces later, the correct move is current Symfony (6.4/7.x) with symfony/mailer and a maintained form package, not a Symfony2 artifact.
Estimate. 1–3 dev days for the native build including tests and accessibility. Add half a day for the spike and decision record. Compare that against an open-ended fork-ownership cost — the comparison closes itself.
Maintenance. Adoption means permanent ownership of a dormant fork. Every PHP minor upgrade, mailer change, and CVE becomes internal work. The steady-state cost is a recurring tax on a non-differentiating feature that a native build covers in days. This is the single strongest argument for the planning conversation: the bundle is cheaper on day one and more expensive by the end of the first quarter.
Support. No vendor, no SLA, no issue triage, no documentation beyond a README. Engineers reverse-engineer rather than escalate. Symfony2 expertise is scarce and depreciating, so adoption also creates a knowledge-retention problem — you are deliberately adding a skill the team will not want to keep.
Scaling. Contact-form volume is low; the scaling risk is delivery, not throughput. Symfony2-era bundles typically send synchronously in the request cycle, so SMTP latency, provider throttling, or a timeout degrades the user-facing response and can silently drop submissions. Queue-backed Mailable plus retry and failure logging eliminates that class of incident. The bundle does not, and retrofitting it is a rewrite of the exact code you adopted to avoid writing.
Failure modes to plan around.
Ramp-up. Native path: standard Laravel work, any team member picks it up, no specialist dependency. Bundle path: Symfony2 archaeology plus fork ownership plus the compliance conversation. The asymmetry is the decision.
Planning verdict. Allocate no integration capacity. Fund a half-day spike to document the rejection, then fund the native build. Log the package in the dependency-risk register as evaluated-and-rejected with the Composer failure attached, so the next person who finds the 0.71 score has the counter-evidence in the same record. If a stakeholder wants the bundle skimmed once for field-design inspiration, allow it as a one-hour reference read with no code committed — then ship our own.
How can I help you explore Laravel packages today?