pugx/filter-bundle
PUGXFilterBundle brings annotation-driven filtering to Symfony and Doctrine: mark filterable entity fields, then render a form that automatically builds DQL queries from user input, giving you searchable, sortable list pages without hand-writing query logic.
QueryBuilder application means a list screen with a search form becomes a form class plus entity attributes rather than a bespoke query layer. That is a real velocity argument for internal tools, back-office CRUD, and reporting screens — exactly the surfaces where users judge us on "can I find the record" and where we get no credit for elegant code.Consider it when:
Look elsewhere when:
FiltersQuery scope, and record this bundle as out of scope.Contains compiles to LIKE '%term%', which cannot use a B-tree index; on large tables you want prefix search or a real search index, and that is a different product decision.To executives — one paragraph. This is a small, free, open-source utility that removes hand-written work from a repetitive class of screen: the searchable, sortable admin list. It does not differentiate the product and it does not touch the customer-facing experience; it is a cost-avoidance lever on internal tooling. The recommendation is narrow and deliberate: adopt it only where we already run Symfony, where it is a low-risk drop-in patch with no migration cost, and do not introduce it into our Laravel services — the framework mismatch is permanent and wrapping it would cost more than the native alternative. Exposure is limited to a community-maintained dependency with no vendor SLA, so it must stay a presentation-layer convenience and never become load-bearing for anything with an availability commitment.
To engineering — the ask.
when()/filled() in a repository method — and keep controllers away from the query builder entirely. Treat the upstream package as a design reference and close the evaluation.%term% on large tables, and add a custom condition class for special cases (JSON containment, full-text) rather than branching inside a controller. Decoupling input names from column names is the only gate stopping someone posting a filter against a field we never meant to expose.The one-line version. Right tool, wrong framework for most of our stack — approve it as a routine patch where we already run Symfony, reimplement the pattern natively in Laravel, and do not let it become infrastructure.
How can I help you explore Laravel packages today?