startsevdenis/liform-bundle
LiformBundle integrates Liform with Symfony to generate forms directly from JSON Schema. It supports schema-driven form creation, validation, and serialization, reducing manual form configuration for APIs and dynamic Symfony applications.
Architecture fit. Despite being catalogued alongside Laravel/PHP packages, this is a Symfony Bundle — its primary artifact is a DI extension plus service wiring that assumes the Symfony kernel (bundles.php, container compilation, autoconfiguration). The actual value is the form-to-JSON-Schema translation, which is almost certainly a thin integration over an existing generator (the liform family of libraries). For a Laravel codebase this is a poor architectural fit at the bundle layer and a potentially acceptable fit at the library layer. Laravel has no symfony/form in its request/validation path; adopting this means introducing Symfony Form as a parallel form-definition system purely to obtain schema output, which is a second source of truth next to Laravel's FormRequest/validation rules. That duplication is the single biggest architectural concern, independent of code quality.
Integration feasibility. Technically feasible but not off-the-shelf. symfony/form, symfony/options-resolver, symfony/property-access, and symfony/event-dispatcher are all Composer-installable as standalone components and coexist with Laravel's container in practice. What does not carry over is the bundle: there is no Laravel service provider, no config publishing, no auto-discovery. Realistic path is to register the underlying generator as a singleton in a small app-level service provider and build Form types by hand, or to fork the bundle and strip the Symfony-specific bootstrapping. Budget for an adapter, not an install.
Technical risk. High, driven mostly by provenance rather than complexity. Zero stars, zero dependents, and a single-maintainer release cadence mean no community validation, no third-party bug reports, and no evidence of production hardening. Because the package is a bundle, most of its surface is configuration glue that will be discarded on Laravel — meaning you inherit maintenance of the wrapper while getting value only from the dependency beneath it. Secondary risks: coupling to Symfony Form internals across major versions (6→7→8), incomplete mapping of custom form types and constraints, and JSON Schema draft-version ambiguity. The generation path is read-only and offline, so the security blast radius is small; the correctness blast radius is not, if downstream consumers validate payloads against the emitted schema.
Key questions.
$ref/definitions handled or inlined?PRE_SUBMIT/POST_SUBMIT listeners reflected in output?Stack fit. Treat this as a library extraction, not a bundle install. Two viable shapes: (a) Laravel service provider binding the underlying generator, with form types authored in app/Forms and kept out of the request lifecycle; or (b) an artisan schema:generate command that runs at build time and writes JSON Schema artifacts to storage/app/schemas or a public API endpoint. Option (b) is strongly preferred — it isolates the Symfony dependency to a dev/build context and keeps it out of the request hot path and out of production's dependency graph where practical.
Migration path. Start by proving the underlying library works standalone in a bare Laravel app with two or three representative forms. If it does, skip the bundle entirely and depend on the library directly; the bundle adds nothing you can use. If the bundle contains non-trivial logic, vendor it (path repository or a fork under your org) so you control the Symfony version constraint. Do not adopt the package as an unqualified require in a production composer.json at zero dependents.
Compatibility. Verify PHP constraint alignment with your Laravel version, and confirm each Symfony component can be pinned independently of any Symfony framework packages already present. Watch for transitive constraints that force a Symfony major your other tooling does not want. Check whether the release cadence (last release noted as 2026-01-30) tracks Symfony majors promptly — a bundle that lags a Symfony major by more than a few months is a stranded asset.
Sequencing.
FormRequest rules; compare emitted schema to actual validation behavior.Maintenance. The dominant cost is ownership of a fork or adapter for a package with one maintainer and no downstream users. Assume you are the de facto maintainer. Pin exact versions, commit the lockfile, and keep a documented patch set. Every Symfony Form major bump becomes your upgrade project, not a composer update.
Support. No community, no Stack Overflow corpus, no issue history to mine. Internal knowledge will live with whoever writes the adapter — a single-point-of-failure risk. Mitigate with a short ADR and schema snapshot tests so behavior is pinned by CI rather than by memory.
Scaling. Generation is CPU-bound and idempotent; scale is a non-issue provided you generate at build time and cache artifacts. If run per-request, expect noticeable overhead on form-heavy endpoints and potential memory growth from repeated form instantiation. Cache aggressively and invalidate on deploy.
Failure modes.
Callback) producing permissive schemas — fail-open behavior in any downstream validator.Ramp-up. Low for the mechanics (a competent Laravel engineer gets a working spike in a few days) but non-trivial for the domain: JSON Schema semantics, Symfony Form internals, and the mapping between them are the real learning curve. Budget roughly one to two sprints for spike plus adapter plus tests before committing, and treat the opportunity score as a signal about the problem space (schema generation from server-side form definitions) rather than a reason to adopt this specific package. Given zero stars and zero dependents, the recommendation is: prototype against the underlying library, and only proceed to production if the adapter stays thin enough that replacing it later is a one-week exercise.
How can I help you explore Laravel packages today?