kitpages/data-grid-bundle
Kitpages DataGridBundle is a Symfony bundle for building configurable data grids with pagination, sorting, filtering, and customizable columns. It helps turn Doctrine queries or arrays into reusable, template-friendly grid views for admin and listing pages.
Architecture fit — poor, by construction. kitpages/data-grid-bundle is a Symfony bundle, not a Laravel package. Its architecture assumes Symfony's runtime contract: a Bundle subclass registered in AppKernel/bundles.php, a DependencyInjection/*Extension that loads Resources/config/services.yml, tagged services resolved via the container, Twig for rendering, and Symfony's Request/EventDispatcher for pagination and filter state. Laravel substitutes each of these: ServiceProvider + explicit bindings, no bundle auto-discovery, Blade instead of Twig, and Illuminate\Http\Request. Nothing about the bundle's wiring survives a copy-paste into a Laravel app — you would be manually reconstructing the service graph.
The portable core is the abstraction, not the bundle. The genuinely reusable idea is the bundle's separation of a DataSourceInterface (the thing that yields paginated rows) from a Grid/Column configuration object. That is framework-agnostic in principle and is roughly 300–500 lines. The Doctrine ORMQueryBuilder source, the Twig grid templates, and the DI extension are all Symfony/Doctrine-specific and would be discarded in a Laravel port. Realistically, this repository is a reference design, not a dependency.
Integration feasibility. Low if the goal is "install and use." Composer will likely resolve only against PHP 7.x-era constraints and Symfony 3/4 components; on PHP 8.1+ / Symfony 6+ you should expect constraint conflicts or runtime deprecations. The last release was 2019-03-27 — six years of PHP and Symfony BC breaks, no security patching, and zero dependents on Packagist, meaning no downstream project is validating it in production. Any adoption is effectively a fork.
Technical risk.
Key questions for the team.
DataSourceInterface/Column design, or attempting to run the bundle itself? Only the former is defensible.Stack fit: mismatched. A Symfony bundle cannot be a first-class citizen of a Laravel application. There is no bundle auto-registration, no services.yml convention, no Twig-by-default, and no Doctrine-by-default. Every integration point would be hand-built glue. This should be framed to stakeholders as "porting a design," not "adding a dependency" — the effort estimate changes by an order of magnitude.
Migration path — recommend a fork-and-extract, not an install.
EloquentDataSource and a QueryBuilderDataSource implementing the same contract, delegating paging to Illuminate\Pagination\LengthAwarePaginator so pagination semantics match the rest of the app (and so we get perPage, page-name, and query-string handling for free).<x-datagrid :grid="$grid" />) plus a small publishable view layer, so teams can override rendering without touching vendor code.ServiceProvider that binds the grid factory and publishes a config file — this is the only piece that maps cleanly onto Laravel idioms.Compatibility. Pin the fork to the app's PHP and Laravel versions explicitly rather than inheriting the original Composer constraints, which will drag in obsolete Symfony components. Drop Symfony/Doctrine dependencies entirely where possible; where the fork needs a container, use illuminate/container. Treat the 2019 codebase as MIT-licensed source material, not as a dependency to constrain against.
Sequencing.
Guardrail: gate the whole effort behind a demonstrated second use case. If only one screen needs a grid, a Laravel-native package or plain Blade is strictly cheaper than owning a fork.
Maintenance. This is the dominant cost. There is no upstream to pull fixes from — the 2019 release is the end of the line. The team inherits full ownership: PHP version bumps, Laravel major-version upgrades, security review of dynamic query construction, and bug triage. Budget it as an internal package, not a third-party dependency: an owner, a changelog, CI, and a versioning policy. The small surface area (~hundreds of lines) makes this tractable, but "tractable" is not "free" — it is a permanent, if modest, tax.
Support. No vendor, no community (77 stars, 0 dependents), no issue activity to mine for known bugs. Internal developers cannot search for answers; every question resolves to reading the fork. Ramp-up for a Laravel developer is low on the domain (grids are familiar) but moderate on the inherited code, because the surviving fragments carry Symfony idioms — service definitions, event-driven state, Twig-era assumptions — that Laravel devs will find unfamiliar and be tempted to half-refactor. Mitigate by rewriting rather than transplanting wherever the code touches the framework.
Scaling. The grid itself is thin — it does not hold state or cache — so scaling is governed entirely by the data source we write. Two risks dominate:
LengthAwarePaginator over a large filtered set issues a COUNT(*) per request; on wide filters this is often the slowest part of the page. Plan for an approximate-count or cached-count strategy on high-traffic surfaces.Failure modes to design against.
Ramp-up. Expect roughly 1–2 weeks for a mid-level Laravel developer to own the fork: a day to read the source, two to three days to build the Eloquent adapter and Blade layer, and the remainder on tests and the injection/ordering hardening above. That is a reasonable investment if the grid abstraction is reused across multiple surfaces. If it serves one admin screen, the honest TPM recommendation is to skip the port entirely: the 2.3/5 score and six-year release gap are accurate signals, and the 4.55 "opportunity" score is best read as "this niche is under-served" — an argument for building a Laravel-native grid internally, using this repository as a design reference, not as a dependency.
How can I help you explore Laravel packages today?