nfqde/entity-list-bundle
nfqde/entity-list-bundle is a Symfony bundle for building reusable entity lists with configurable data sources, filters, sorting, pagination, and rendering helpers, simplifying admin and backend list screens.
Architecture fit. The decisive fact for a TPM is that nfqde/entity-list-bundle is a Symfony bundle targeting Doctrine ORM, not a Laravel package. It relies on bundle registration (config/bundles.php / AppKernel), Symfony’s DI container and config-tree extensions, a Symfony Request for filter/sort/paging parsing, and Doctrine QueryBuilder assembly. A standard Laravel application has none of those seams: no bundle lifecycle, no Doctrine by default, and Eloquent rather than ORM entities. Even on a Laravel + Doctrine hybrid stack, the majority of the package’s code — the Symfony wiring layer — is what you would be installing and not using. Verdict: not adoptable as a Composer dependency in a Laravel application; viable only inside a contemporaneous Symfony/Doctrine service. For Laravel, the value is the pattern, not the code.
Integration feasibility. Low. Zero stars, zero dependents, and archived status mean there is no downstream evidence of a clean install against any supported framework version, and no upgrade path. The reusable core — a declarative list definition (columns, filters, sort order, page size) compiled into a filtered, paginated query — is small and well understood. A TPM should frame the choice as fork-and-port vs. reimplement: the port carries Symfony bundle fluency and Doctrine-era constraints; the reimplementation is a bounded, testable piece of work on the team’s native stack. The MIT license is the one clean signal — forking and internal maintenance are legally unencumbered, which removes the licensing question from the decision.
Technical risk.
*Bundle naming and pre-Flex packaging strongly suggest Symfony 2/3-era code with PHP 5.6/7.x constraints. Treat PHP 8.2+ compatibility as unproven until composer.json is read.ORDER BY/WHERE (schema leak, SQL injection) and unbounded page sizes (DoS, connection-pool exhaustion).COUNT(*) over joined, filtered queries routinely disagrees with the returned rows; totals are a user-visible correctness issue, not a cosmetic one.Key questions (for the decision record).
composer.json constraints and the last commit date say about PHP/Doctrine/Symfony compatibility with our runtime?Stack fit. For a Laravel product, the correct posture is do not integrate; borrow the design. The package defines a useful contract — one list definition per entity declaring selectable columns, filter definitions, sortable fields, default page size, and paging metadata — and that contract is the durable asset. Three postures, in descending order of preference:
spatie/laravel-query-builder for allowlisted filter/sort/include parsing, Laravel’s paginator/cursorPaginator, Eloquent local scopes or a ListDefinition value object per entity, and a single controller action per list.entity-list package exposing the same contract (definition → validated query → paged payload). This is the right home for the shared policy: filter allowlists, page-size caps, sortable-column allowlists.Migration path. There is no migration from this package into Laravel, because nothing installs. The realistic path is a greenfield reimplementation of the abstraction. Copy the concept, not the code: define a ListDefinition per entity (fields, allowed filters, sortable columns, page-size cap), compile it to a query builder, and expose it through one controller with validated query parameters. Expect this to be small and bounded — days, not a project — which is precisely why the TPM recommendation is to build rather than port.
Compatibility. Treat as unverified until composer.json is read. Assume PHP ≤ 7.x and Doctrine 2.x semantics (string QueryBuilder, annotation-based filter metadata, no attributes, no DBAL 4). If those constraints exclude our runtime, discard the fork option immediately and stop spending evaluation time on it. Note the annotation angle specifically: doctrine/annotations deprecations/removal would force a fork that converts annotations to PHP attributes before the package runs on modern PHP at all.
Sequencing.
composer.json, README, and last-commit date; confirm framework era and PHP constraints.ListDefinition contract, the filter/sort allowlist policy, page-size cap, and the paging response shape (rows + total + applied filters).UserListFactory) so the seam for swapping implementations survives.Maintenance. Archived upstream means the adopting project owns 100% of maintenance from day one: every PHP minor, Symfony major, and Doctrine major is an internal ticket, and with zero dependents no external community shares that work. A fork is a permanent line item, not a one-time integration cost. The reimplementation posture avoids this entirely — the code lives on the team’s own stack, with the team’s own upgrade cadence.
Support. No vendor, no SLA, no advisory feed, no maintainer to escalate to. If a fork is created, the internal owner must be named explicitly and the provenance documented (source commit, divergence log, patch queue, pinned versions) so a future engineer can reconstruct intent. Commit composer.lock, pin exact versions (x.y.*), and state an intended replacement date.
Scaling. Listing and filtering is the canonical admin-panel scaling problem, and the package’s likely approach — offset pagination with COUNT(*) over filtered joins — degrades predictably:
COUNT(*) over filtered joins is often the dominant cost; cache or approximate.Failure modes.
Ramp-up. The concept — define columns/filters/sort, paginate, render — is learnable in an afternoon; conceptual ramp-up is negligible. Code-level ramp-up is the problem: reading the source requires Doctrine and Symfony-bundle fluency (config trees, compiler passes, query-builder assembly) that a Laravel team neither has nor should acquire for this purpose. Net assessment for the TPM: the code carries a steep reading cost relative to a small conceptual payload, which reinforces the recommendation — borrow the pattern, keep the implementation on our own stack, and spend the saved effort on the allowlist and paging policy that actually protects production.
How can I help you explore Laravel packages today?