Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Tablebundle Laravel Package

jgm/tablebundle

A PHP/Symfony bundle for building and rendering data tables from arrays or query results, with configurable columns, sorting, pagination, and Twig templates for flexible, reusable table output.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. jgm/tablebundle remains a Symfony bundle, not a Laravel package, and v1.3.3 does nothing to change that. The single most important finding stands: it targets Symfony's Bundle registration, DI container compilation, and Twig templating. Laravel's service container, package discovery, and Blade view layer are structurally different. In fact, this release strengthens the finding — the headline bugfix is "rendering table filters with the filter Twig function caused an error," which is direct evidence that filter rendering is implemented as a Twig extension rather than application-layer logic. That is a hard dependency on the Symfony/Twig view layer, not an incidental one. Adoption into Laravel remains a framework port, not a configuration exercise.

Integration feasibility. Low, unchanged. Three paths remain: (1) run Symfony's HttpKernel/Twig inside Laravel via a bridge; (2) extract the table-definition and rendering logic into a standalone Laravel package; (3) read the source as a design reference and reimplement the declarative table pattern using Blade components. Only (3) is defensible for a production timeline, and v1.3.3 only sharpens path (3): the getActiveFilter/getActiveFilters bugfix tells us where filter state actually lives in this codebase — inside a TableView object with Twig-facing accessors — which is a small, legible surface to reimplement and a poor surface to bridge.

Technical risk. Still High overall, but the risk profile has shifted in two directions at once.

  • Liveness improved (slightly). The prior assessment stated the package was archived with the last release in August 2016. A v1.3.3 release exists, with a named external contributor credited. Whether the repository was unarchived, transferred, or simply released from a dormant branch should be verified before anyone relies on the "archived" label. Treat "archived/dead" as no longer verified and re-check the repo state, issue tracker, and commit cadence directly rather than citing the earlier finding.
  • Release discipline is poor. TablieView::getActiveFilter → TableView::getActiveFilters is a breaking rename shipped in a patch release: the class name changes (fixing a Tablie typo), the method name changes, and the return contract changes from singular to plural. Anyone pinned to ^1.2 and running composer update gets a silent BC break. This is a textbook semver violation and a strong signal that there is no compatibility policy, no deprecation cycle, and no consumer base large enough to complain — which is exactly the environment you do not want to inherit as a dependency.
  • Staleness unchanged. The fixes are narrow bugfixes against a 2016-era codebase (Symfony 2.x/3.x, Twig 1.x). Three bugfixes do not constitute a modernization: no PSR-4 re-baseline, no PHP 8 compatibility work, no dependency upgrades, no security review. The security posture remains unacceptable for direct adoption — no CVE monitoring, no patch SLA, no maintained vendor. A contributor pushing two bugfixes does not establish a security response capability.
  • Dependents still zero. Still no downstream maintainers surfacing runtime issues.

Key questions. Updated from the prior assessment:

  • Is the repository actually archived, and if not, who owns it now and what is the stated support posture? The prior "archived since 2016" claim must be re-verified from the source, not carried forward.
  • Is there a v2.0 or deprecation shim planned for the getActiveFilter → getActiveFilters rename, or was the BC break simply published as a patch? The answer tells you whether upstream releases are safe to track at all.
  • Is there a maintained fork or modern equivalent (Filament, DataTables, Grid lineage) delivering the same no-JS, server-rendered model?
  • Does the requirement mandate no JavaScript, or "minimal client dependency"? These lead to different build-vs-port decisions.
  • What is the feature delta between this bundle's declarative API and a ~200-line Blade component with query-string pagination, sorting, and filtering?
  • Who owns the code internally for the next 24 months if we fork it?

On the score. The composite score of 0.985 should still be treated as a scoring artifact, not a quality signal, and a patch release is not grounds to revise it in either direction. The opportunity: 7.14 remains the meaningful number — no-JS, server-side, declaratively defined tables are genuinely under-served in the ecosystem. The maintenance, stars (8), and dependent count (0) continue to tell the real story, and v1.3.3 adds a new data point: active-but-undisciplined, which is arguably worse than dormant for anyone planning to consume it, because it creates the illusion of a safe dependency.

Integration Approach

Stack fit. Poor as a dependency, good as a specification — unchanged. Laravel teams should not attempt to load a Symfony bundle into a Laravel application; the DI, routing, and templating contracts diverge at every layer. v1.3.3 reinforces this: the filter Twig function is now a proven, load-bearing part of the rendering path (it was broken, and fixing it was a release headline). Porting means reimplementing that function against Blade regardless of how small the rest of the API is.

Migration path. Recommended sequence, updated:

  1. Spike (1–2 days). Clone the repository at v1.3.3, inventory the public API (table builder, column definitions, sort/filter/pagination handling), and enumerate every Symfony/Twig touchpoint. Pay specific attention to the TableView filter-state accessors touched by this release — they define the state model you must reproduce. Output: a one-page capability list.
  2. Decide port-vs-reimplement. Reimplement in Laravel-native terms — Blade components, a fluent Table builder, form requests for filter/sort state, Eloquent/query-builder adapters, and a dedicated filter-value resolver replacing the Twig filter function. Do not fork unless the API proves richer than expected; the v1.3.3 rename demonstrates that upstream API shape is not stable enough to mirror.
  3. Internal package. Ship as a private Composer package (acme/laravel-tables) with its own versioning, semver policy, and deprecation rules — explicitly stricter than upstream's, since upstream just demonstrated it will rename public methods in a patch.
  4. Attribution. MIT permits reuse; preserve the original copyright notice and document that the design was derived from jgm/tablebundle at v1.3.3.

Compatibility. Treat the upstream composer.json as a historical document. Assume PHP 5.5–7.0 era constraints, Twig 1.x, and Symfony 2.7/3.0 components. v1.3.3 did not touch these constraints — it moved behavior, not dependencies — so the re-baselining cost is unchanged. Also treat the version number as non-diagnostic: 1.3.3 looks like a safe patch and is not one.

Sequencing. Unchanged in principle: do not sequence this as "adopt, then extend." Sequence it as "extract the pattern, build minimal, then extend against real requirements." If any team member argues for adopting the dependency because "it's actively maintained now," that argument should be closed by the v1.3.3 BC break — active maintenance without a compatibility policy is a liability, not a reassurance.

Operational Impact

Maintenance. Still effectively 100% internal from day one, but the nature of the burden changed. Previously the risk was "no upstream at all." Now the risk is "an upstream that publishes BC breaks in patch releases," which means that if any copy of the dependency survives in a branch, a routine composer update can break builds for reasons unrelated to your own work. Budget for a named owner and an internal SLA. If the fork is unmaintained, it becomes a "nobody touches tables" zone within ~18 months.

Support. No vendor, no support contract, no CVE feed. A single contributor fixing two bugs is not a support channel and must not be treated as one in planning. Security review of any derived code remains mandatory before production, particularly HTML escaping in table rendering and any raw-value output paths. Keep the derived package in the internal dependency-inventory and vulnerability-scanning scope so it is at least visible when scanners run.

Scaling. Unchanged. Server-rendered tables push work to PHP and the database; without JavaScript, sorting and pagination are round-trips — fine for read-heavy admin and reporting, not for high-interaction dashboards. Watch for (a) N+1 queries as column definitions resolve related data, and (b) unbounded result sets when pagination is optional. Enforce a default page size and hard maximum in the builder API itself, not in caller code.

Failure modes. Ranked by likelihood and impact, updated:

  • Upstream BC break on update — new, and now demonstrated. A patch release renamed a public class and method (TablieView::getActiveFilter → TableView::getActiveFilters). Mitigate by pinning exact versions in any surviving usage and, better, by not depending on upstream at all.
  • Framework drift — PHP or Laravel upgrade breaks the derived code because it was ported structurally rather than idiomatically. Mitigate with a test suite covering rendering, sorting, filtering, and empty states.
  • Query explosion — eager-loading not enforced by the builder; a table with five relation columns issues 5N queries. Mitigate by requiring explicit relation declarations and asserting query counts in tests.
  • Escaping regressions — any reimplementation of the 2016 rendering code carries its escaping assumptions forward. Re-audit rather than copy.
  • False confidence from upstream activity — the most insidious new failure mode. Three bugfixes read as "alive and improving" in a status update, and can carry a bad dependency decision past the point of cheap reversal. Mitigate by writing the "why we did not adopt" rationale, and the v1.3.3 BC break as its evidence, into the decision record.
  • Silent divergence — no upstream to compare against, so "is this still how it should work?" is unanswerable. Pin expectations in the internal package README.

Ramp-up. Low for developers with Twig/Symfony exposure — the declarative table pattern is intuitive and the codebase is small. Moderate for Laravel-only developers, who must first unlearn bundle conventions and then verify the ported abstraction matches Laravel idioms (policies for row actions, validation for filter inputs, Eloquent scopes for base queries). One senior engineer for the port and a half-day walkthrough for the team. This release does not change the estimate.

Bottom line. Do not adopt jgm/tablebundle as a dependency under any circumstance. v1.3.3 is not a reason to revisit that: it is three narrow bugfixes to a decade-old Symfony/Twig codebase, published as a patch release that nonetheless contains a backward-incompatible public API rename, which is a clearer negative signal than the archive status it replaces. Note for the record that the prior assessment's "archived, last release August 2016" characterization should be re-verified — the package has demonstrably shipped since — but the correction does not move the recommendation. The opportunity remains legitimate: no-JS, server-rendered, declaratively defined tables are a real gap in the Laravel ecosystem. Capture it with a small internal package that borrows the API shape and discards everything else, including upstream's release discipline. Estimate one to two engineer-weeks for a focused port; treat the upstream repository as a reference document rather than a component.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console
pnscripts/filament-broadquill-lite
pnscripts/laravel-sentfold-lite
vleap/mx-sdk-laravel-internal
twidpay/utils
htetmyathlaing/scout-elasticsearch-driver
artisan-toolbox/front-awesome
ls/client-assistant
users-au/laravel-client
cgv/localized-resource