symfony/form
Symfony Form lets you build, process, and reuse HTML forms in PHP with a flexible, component-based API. Handle validation, data mapping, and rendering with ease in any Symfony or standalone app.
Architecture fit
symfony/form is a framework-agnostic, standalone PHP component (a read-only subtree split of the symfony/symfony monorepo). It provides the form abstraction layer itself: FormType definitions, data mappers, model/view transformers, an event-driven lifecycle (PRE_SET_DATA, POST_SUBMIT, etc.), and an optional validator bridge.symfony/form; its idioms are FormRequest + Illuminate\Validation + Blade + Eloquent. Adopting this package means running a second, parallel form and validation model alongside the Laravel-native one.CollectionType), DTO/command-style input mapping, form definitions reused across multiple entry points, and multi-step flows (FormFlow).Integration feasibility
Illuminate\Http\Request extends Symfony\Component\HttpFoundation\Request, so HttpFoundationRequestHandler and UploadedFile handling work without a shim.Symfony\Contracts\EventDispatcher\EventDispatcherInterface, not illuminate/events.TranslatorInterface vs Laravel's __()/translator; without an adapter, validation messages come back untranslated. Both 8.1.8 and now 8.1.9 are dominated by translation reviews (Tagalog, Bulgarian, Greek, Urdu, Japanese, Turkish, Persian) and malformed-placeholder fixes, which confirms the error strings are Symfony-catalog-owned, not Laravel-owned. Adopting means either consuming Symfony's catalogs or mapping them into lang/ deliberately.CsrfExtension vs Laravel's VerifyCsrfToken/@csrf; running both is a common self-inflicted outage.ValidatorExtension requires symfony/validator; Laravel's validator is a separate implementation.symfony/twig-bridge is Twig-only, so form rendering must be hand-rolled as Blade components.Technical risk
v8.1.9 (2026-09-29) lands two further FormFlow correctness fixes on top of 8.1.8's creation/step-fallback/backward-navigation/reset fixes:
CurrencyType with active_at null (nullable model data), and ChoiceType placeholder remaining selectable when the parent form is optional (dynamic/nested forms). These are narrow, but they are the exact edges of the "complex forms" use case that motivates adoption.Dependents: 0 and the synthetic last-release timestamp are artifacts of a read-only split repo, not real signals. Do not use either for supply-chain or recency decisions — evaluate against symfony/symfony instead.ChoiceType, session contamination by non-serializable objects, POST/file index merging in collections, duplicate errors from repeated ValidatorExtension instantiation, enum/type inference on mapped DTOs, ICU whitespace and placeholders in date/number transformers. 8.1.9 adds no new categories; it deepens two existing ones (FormFlow, ChoiceType). That is a stable risk profile, not a widening one.Key questions
symfony/validator, Illuminate\Validation, or both — and what is the system of record for error messages?FormFlow's session-backed state model match our session driver, do we have stateless/API surfaces where it must be excluded, and are we prepared to absorb upstream behavior changes (including 8.1.9's per-step validation semantics) on a patch cadence?symfony/symfony, not this repository?Stack fit
symfony/form, plus symfony/validator and symfony/event-dispatcher (or thin adapters over existing Laravel services). Skip symfony/twig-bridge if we stay Blade-only.FormFactoryInterface (a FormFactory composed of explicitly chosen extensions), a Symfony\Contracts\EventDispatcher\EventDispatcherInterface adapter, a TranslatorInterface adapter, and a request handler reading from the current Illuminate\Http\Request.FormType classes. Map submissions to DTOs/commands, then hydrate models in an application service. This is the main architectural payoff — and the biggest cultural shift from $request->validate(). Note the 8.1.9 enum-inference fix lands precisely on this pattern (private properties declared by parent classes), so typed DTO hierarchies are safe on >= 8.1.9 but should be regression-tested when we bump.Migration path
symfony/form first; leave existing CRUD on Laravel validation permanently.acme/forms) that owns the wiring, a base AbstractType, Blade components for label/input/error/CSRF, and a test helper. Application code depends on that package, never on symfony/form directly — this is what keeps an upgrade from becoming a codebase-wide refactor.Compatibility
8.0.x line predates the FormFlow navigation fixes, and 8.1.0–8.1.8 predate both the per-step validation semantics and the pre-8.1 session-data fix in 8.1.9; do not select them.CsrfExtension and rely on Laravel middleware, or the reverse — never both.lang/ files, or ship Symfony's catalogs. 8.1.8 and 8.1.9 together are almost entirely translation review and malformed-placeholder cleanup; without a deliberate mapping we ship English-only error messages by accident, and fixes made upstream never reach our users.FormFlow, CSRF-token flows) assume stateful sessions. Exclude stateless/API surfaces or route them to the shared session store.Sequencing
symfony/form" rule documented in the repo.Maintenance
ChoiceType placeholder, and collection-index fixes are signal.symfony/symfony. Otherwise engineers will file reports that go nowhere.Support
Scaling
Failure modes
_token, _method, or collection indices.ChoiceType placeholder becoming non-selectable (or wrongly selectable) depending on parent optionality — covered in 8.1.9, so pin forward and cover with a rendering test.Ramp-up
FormType classes get reviewed by the owning team.How can I help you explore Laravel packages today?