mnugter/jsonapi-rql-finder-bundle
Symfony/PHP bundle that integrates an RQL finder into JSON:API resources, letting clients filter, sort, and paginate with expressive query expressions. It bridges RQL parsing and Doctrine queries so endpoints return consistent, spec-compliant responses with less custom code.
Architecture fit — unchanged, still low as shipped. Release 3.0.0 does not alter the fundamental mismatch. The package remains a Symfony bundle, not a Laravel package: its value is delivered through a bundle class registered in bundles.php, DI service definitions, and integration with paknahad/jsonapi-bundle (itself a Symfony bundle). There is still no service provider, no facade, no Laravel config publish path, and no test coverage against Laravel. PHP 8 support changes the runtime floor, not the extension mechanism. Treating this as a "Laravel/PHP package" remains a category error that will surface on the first integration attempt.
What is actually reusable — unchanged. The narrow, portable layer is still the RQL grammar handling: parsing the filter= / sort= query string into a normalized predicate tree, then translating that tree into a query-builder expression. That translation logic remains coupled to Doctrine's query builder, so the parser may be worth carrying forward while the translation layer gets rewritten against Eloquent. The RQL syntax contract — the thing your API consumers see — is the durable asset; the Symfony glue is not. A PHP 8 bump does nothing to change this split.
What 3.0.0 actually delivers. The entire release note is the phrase "Support for PHP 8." That is a real and useful change — it removes the most likely hard blocker identified in the prior assessment (a 2021–2022-era PHP constraint that would have excluded Laravel 10/11 runtimes) — but it is the only stated change in a semver-major release. A major version number implies breaking changes, and none are documented. For a TPM this is itself a signal about release discipline: if a major bump ships with a one-line note, assume the diff is the only changelog that exists and plan to read it.
Integration feasibility — unchanged in structure. The same three paths apply, in the same descending order of pragmatism:
Technical risk — still high, marginally improved. The PHP 8 constraint lift is genuine progress and should be recorded as such: it is the difference between "cannot run" and "can run." Everything else stands. Seven stars, zero dependents, and a prior release of 2022-03-21 mean there is still no downstream validation and no evidence of production use at any scale. Single-maintainer. Moving from dormant to "one release in three-plus years" is a sign of life, not a maintenance cadence — do not read it as a commitment to security patching or issue triage. The dependency on paknahad/jsonapi-bundle compounds this: you inherit that bundle's staleness, its Doctrine assumptions, and its own maintenance risk, none of which 3.0.0 addresses.
Security surface worth flagging early — unchanged. Exposing a filter DSL to untrusted clients widens the attack surface in two specific ways: arbitrary field access (a client filtering on password_hash or a relation they should not traverse) and parser denial-of-service (deeply nested or pathological expressions). Any adoption needs a strict allowlist of filterable fields and depth/complexity limits, neither of which this package is positioned to enforce for you. A major version bump is also the moment to re-read the parser for any changed recursion or depth handling — assume nothing was hardened unless the diff says so.
Key questions before committing engineering time:
spatie/laravel-query-builder or Laravel JSON:API's native filter support solves this with active maintenance and modern PHP support.paknahad/jsonapi-bundle carry its own version constraints that still pin you to the 2021–2022 era?Stack fit — still poor out of the box. The package assumes Symfony's bundle lifecycle and Doctrine's query builder; a Laravel application assumes service providers, Eloquent, and middleware. There is no overlap in extension mechanism. PHP 8 support means the code can now execute on your runtime, which removes a blocker but does not create an integration seam. The conceptual overlap — HTTP query string in, constrained query out — is real but must be rebuilt.
Migration path. Recommended sequence for a team that has decided RQL is the right contract:
eq, ne, lt, gt, in, like, and, or, plus sort and pagination). Not all of RQL is worth supporting, and a documented subset is easier to secure and to evolve.FilterDefinition → Builder. Keep it isolated so the grammar can be swapped without touching controllers.Compatibility — improved, with caveats. The prior blocker is lifted: 3.0.0 supports PHP 8, so the parser can plausibly run on a Laravel 10/11 runtime. Three things still need verification before the spike concludes: (a) the exact PHP range — 8.0 only versus 8.1+/8.2+ materially changes your options; (b) the Symfony constraint, since the bundle layer being incompatible is fine if you only want the parser, but you need to know which is which; (c) whether paknahad/jsonapi-bundle and the parser's own dependencies accept the same PHP/Symfony ranges. Laravel's own requirements are no longer the constraint — the dependency graph behind this package now is.
Sequencing. Do not sequence this behind a feature delivery. The RQL contract is an API design decision with a long tail; make it early, or default to a maintained Laravel filtering package and defer RQL until a consumer demands it. Note that the 3.0.0 release does not create urgency — it does not make the package maintained, and one release does not justify pulling the decision forward.
Alternatives to evaluate in parallel: spatie/laravel-query-builder (mature, allowlist-oriented, PHP 8 supported), laravel-json-api (if you are genuinely doing JSON:API, its filter layer is the closest maintained analogue), or a thin custom parser if the RQL grammar is contractually required.
Maintenance. Still the dominant cost. 3.0.0 is a positive datapoint — someone is still at the keyboard — but a single release after a three-plus-year gap does not establish a cadence, a triage process, or a security-response path. If you vendor or fork, budget for a named owner and a periodic review cadence; an unowned fork rots faster than an unowned dependency because it is invisible to tooling. Pin your fork or dependency to 3.0.0 explicitly; if you adopt anything from this repo, do not track a branch.
Support. Still none available. No issue triage commitment, no CVE response, no upstream fix path. Any production incident traces to your own team. The 3.0.0 release slightly raises the odds someone responds to an issue, but it does not constitute support, and you should not plan around it.
Scaling. Parsing overhead per request is negligible relative to database work; the real scaling risk is query shape. A permissive RQL surface lets clients compose filters and sorts that generate unindexed scans, deep relation joins, and unpredictable cardinality. Mitigations: allowlist, depth and complexity caps, per-endpoint rate limits, and query-plan review of the top filter combinations before launch. Nothing in 3.0.0 changes this analysis.
Failure modes to design for explicitly:
Ramp-up. Team cost is moderate but real: engineers must learn RQL syntax, the allowlist model, and the translation layer's edge cases. Because there is no documentation ecosystem around this package specifically — and 3.0.0 ships with a one-line note rather than a changelog — ramp-up depends on the underlying RQL spec and on whoever performs the initial port. Budget for that person to write the internal docs; they are the only docs that will exist.
Bottom line for a TPM. The recommendation is unchanged: do not adopt this package. Adopt the idea — RQL as a documented filter contract — and either implement the subset you need on Laravel's query builder or use a maintained Laravel filtering library. The package is best treated as a reference implementation and a source of design input, not as a dependency. What 3.0.0 changes is narrow but worth recording: the PHP version constraint is no longer an automatic disqualifier, so the remaining obstacles are architectural rather than environmental. What it does not change is the core picture — still a Symfony bundle with no Laravel seam, still zero dependents, still a single maintainer, still a major version shipped with a one-line note. The score of 0.255 and seven stars are consistent with the same conclusion as before: this is not a component to build production API surface area on.
How can I help you explore Laravel packages today?