haddowg/json-api-symfony
A Symfony bundle for building JSON:API-compliant APIs, handling resource serialization, relationships, and spec-compliant responses with minimal configuration.
Architecture fit
DataProviderInterface, DoctrineExtensionInterface, ExtensionContext). There is still no Laravel service provider, Eloquent data provider, or Laravel validation bridge. Treat "Laravel support" as an integration project we own, not a configuration flag.DataProviderInterface now mandates relatedToOneMatches() and relatedToOneMatchesBatch(), and DoctrineExtensionInterface::apply() takes an ExtensionContext instead of loose arguments. There is also a new typed constraint-translator extension with the Custom bridge dropped — an Eloquent filter bridge must be written against the typed contract, not the old one.Integration feasibility
readOnly resource shorthand, composite attributes, and OpenAPI bridging of descriptions, security booleans, and the id pattern.readOnly shorthand materially lowers the cost of our read-only pilot: one decorator instead of hand-disabling write capabilities.Technical risk
on() attributes to flattened attributes, linkage methods renamed to data, lazy-by-default linkage, opt-in counting, pagination as single source of truth, removed zero-config pivot filter (filter[position]), and a removed Custom constraint bridge. 1.0.0 is a stabilisation event, not evidence the churn is over.GET /{type}/{id}/{rel} and /relationships/{rel}, relationships can be authorized independently of the parent, and collection reads require a securityList key. Correct behaviour, but it will surface as new 403s in any consumer built against pre-1.0 behaviour.request-host-absolute) is a reverse-proxy/trusted-host configuration dependency that will bite in containerised deployments.Key questions
Stack fit
DataProviderInterface (including both batch match methods), a typed constraint-translator for our filter vocabulary, an authorization predicate adapter over gates/policies, and a validation adapter — then maintain all four.Migration path
1.0.0 exactly in composer.json with a committed lockfile; treat every subsequent release as a code change requiring review and a full test run.Compatibility
Custom constraint bridging was removed, any filter-mapping code we prototype must target the typed translator; do not build on pre-1.0 examples found in blog posts or older docs.Sequencing
readOnly shorthand, Eloquent provider prototype, OpenAPI export, measure adapter effort honestly.securityList and read-security expressions wired to Laravel gates.meta.pivot.Maintenance
Support
Scaling
COUNT(*) blowups.include depth.Failure modes
securityList key on collection reads — the most likely production surprise.filter[position] pivot filter, which will now fail as an unknown parameter.Ramp-up
meta.pivot, securityList, extension contexts, and the typed constraint translator.How can I help you explore Laravel packages today?