rogerdsh/liform-bundle
A Symfony bundle that generates JSON Schema from Symfony forms, exposing form structure for client-side rendering and validation. Integrates Liform with Symfony to produce schema output for APIs and JavaScript form builders.
What it is. rogerdsh/liform-bundle is a Symfony bundle — not a Laravel package — that wraps the Liform project to introspect symfony/form FormType trees and emit JSON Schema. It is a thin integration layer over upstream liform/Limenius code, published under a personal namespace.
Architecture fit. The primary framing of this evaluation (Laravel/PHP) is itself the headline finding: there is no fit for a Laravel application. The package delivers value through Symfony's Bundle class, DI extension, and FormType metadata graph. Laravel uses service providers and does not ship symfony/form or symfony/http-kernel in its default dependency tree, so adopting this means importing a parallel framework's form subsystem to solve a problem Laravel already solves differently (FormRequest rules, laravel-data, or OpenAPI annotations). For a Symfony-based service, the architectural fit is natural if the goal is precisely "FormType → JSON Schema"; it is not a general schema-generation layer.
Technical risk — high, and concentrated in provenance.
symfony/form to an EOL major. That is not a package-level inconvenience; it becomes an application-wide upgrade blocker, because symfony/form is a shared transitive dependency.rogerdsh/liform-bundle vs. the established Limenius bundle) suggests a personal fork or a rename. Divergence from upstream is unverified, which makes both patch adoption and vulnerability triage manual work.Key questions to resolve before any commitment
composer.json permit, and does composer why-not symfony/form:^7 resolve cleanly?FormTypeExtensions, custom Constraints, nested CollectionType, EntityType (which leaks Doctrine metadata), and dynamic choices? These are where schema generators typically fail silently.Stack fit. Binary. Symfony service with existing FormType investment → plausible, timeboxed PoC. Laravel service → reject; the cost of importing symfony/form to reuse a schema generator exceeds the cost of writing a 200-line generator against FormRequest rules or laravel-data metadata.
Migration path. Treat it as a replaceable implementation detail, not a dependency. Define an internal SchemaGenerator contract (input: a form/type descriptor; output: schema array) and bind this bundle behind it. That single decision converts "we adopted an unmaintained package" into "we adopted a swappable strategy," and makes a later replacement a one-class change rather than a refactor. If adopted, pin an exact commit hash via a vcs or path Composer repository and vendor the fork internally — do not rely on Packagist availability for a package with zero dependents.
Compatibility. Run a real resolution test, not a read of the README: install into a scratch app on our target Symfony/PHP version and resolve. Then diff emitted schemas against hand-written expectations for a canonical form set. The PoC is cheap; the answer arrives in days.
Sequencing (2-week timebox, hard stop).
FormTypeExtension or a schema post-processor.Maintenance. Assume fork-and-own from day one. There is no realistic path to upstream contribution given the adoption profile; plan for one engineer to hold context and for the package to be upgraded in lockstep with Symfony majors — a recurring, unbudgeted tax tied to a component we did not choose.
Support. No vendor, no community, no issue-tracker throughput to depend on. Internal escalation only. Documentation is upstream's, which will not describe this fork's behavior. This is acceptable for an internal tool, unacceptable for anything on a customer-facing contract surface without a documented fallback.
Scaling. Effectively a non-issue. Schema generation is a build/request-time CPU operation over metadata; it is cacheable by form-type identity and cheap relative to rendering. The scaling concern is not throughput — it is cache invalidation: if schemas are cached and a FormType changes, consumers silently drift.
Failure modes, ranked by likelihood × blast radius
symfony/form constraint forces the whole app onto an EOL major. Highest blast radius; verify first.EntityType, nested collections, dynamic choices. Fails at form-definition time, i.e., often in production paths not covered by tests.Ramp-up. Low for engineers already fluent in Symfony Forms — the concept is legible and the wrapper is thin. The real ramp-up cost is institutional: someone must own the fork, the golden-file fixtures, and the upgrade cadence. Budget that explicitly; it is the dominant total cost of ownership here, not the integration effort.
TPM recommendation. Do not adopt on adoption signals — there are none. Permit a two-week PoC only inside a Symfony service, only behind an internal interface, and only with a pre-agreed "build our own" fallback. For the Laravel context implied by the request, close the evaluation now.
How can I help you explore Laravel packages today?