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

Ux Datatables Laravel Package

pentiminax/ux-datatables

Symfony UX DataTables integration that adds interactive, AJAX-powered tables to Twig with server-side processing, configurable columns, and a simple PHP API for Symfony applications.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • Stack mismatch to resolve first: despite the framing of this intake as a “Laravel/PHP package,” the release notes describe UX DataTables, a Symfony UX bundle (Symfony + Twig + Doctrine ORM + Stimulus + Mercure + npm-published assets). There is no Laravel/Eloquent integration surface described. If our target application is Laravel, this is an architecture non-fit and the evaluation should stop here. If we run Symfony anywhere in the estate, the fit is strong and idiomatic.
  • Core design is a server-driven table abstraction: AbstractColumn, Filter, BulkActionContext, Doctrine-backed providers, with a Stimulus controller for the frontend. This aligns well with a Symfony app that already owns its query layer; it is a poor fit for apps that expect the table library to own persistence or that use a non-Doctrine data layer.
  • Server-side vs client-side modes are now meaningfully differentiated: value formatting applies to rendering/export, client-side tables sort/search on the formatted value, server-side tables query the underlying field. That is a coherent design but creates a dual-semantics contract teams must understand.
  • Optional dependency on openspout/openspout for server-side CSV/XLSX keeps the core lean; symfony/serializer is now required for Ajax payload mapping, which is a real (if small) dependency addition.

Integration feasibility

  • Composer-installable, upgrade guide provided, runnable demo/ Symfony app covering columns, filters, layouts, bulk actions, exports, formatting, row events, theming. The demo materially de-risks evaluation and is the fastest path to a go/no-go.
  • Deprecation of the route loader interface removed in Symfony 8.2 signals active forward-maintenance, but also sets a Symfony version floor/ceiling to verify against our pinned framework version.
  • Frontend is shipped as a rebuilt npm package version-aligned to 1.2.0; teams must own asset rebuild/publish in their pipeline.

Technical risk

  • Highest: bulk-action scope enforcement is partial by design. The permanent table scope is enforced for explicit Doctrine bulk selections via customizeQueryBuilder(). Custom providers must opt in via ScopedIdentifierProviderInterface; API Platform tables and providers without that interface still require handlers to enforce scope themselves. Any table in our estate using a custom or API Platform provider carries residual cross-tenant risk until audited.
  • Private Mercure is opt-in at the publisher level. Tables with withCredentials now publish private updates, but existing custom publishers only emit a warning when used for a private table. Warning-only enforcement is a silent-exposure path if logs aren't monitored.
  • Formatted values become searchable/sortable state on client-side tables. If formatValueUsing() emits a lossy or redacted representation, users will search and sort on the transformed value, not the truth. Escaping remains default-on unless a column opts into trusted HTML — that opt-in is a review gate.
  • Export output is behaviorally changed, not just extended: translated headings, translated choice labels, translated Yes/No, money rendered in currency units, formatter output preserved. Downstream consumers (finance imports, reconciliation jobs, emailed reports) may break or silently misread columns.
  • Money edit semantics changed to currency units with 10^decimals used consistently for cents-backed display, plus boolean edit fields mapped to checkboxes. Any handler expecting prior submission shape is a breaking change.
  • TernaryFilter default semantics flipped to compare true/false; NULL semantics now require explicit nullable(). Silent filter-result drift.
  • Selection-column ordering offsets changed so initial numeric ordering indexes refer to declared columns, excluding the checkbox. Persisted table state or hard-coded column indexes will point at the wrong column.
  • Locale default now follows request locale — apps with partial translation coverage may see unexpected language switching.
  • Modal adapter now mediates delete/detail/edit/Ajax confirmations with native as fallback; custom modal implementations and any test asserting on native confirm() will fail.

Key questions

  1. Are we a Symfony shop or a Laravel shop — and if Laravel, why is this on the docket at all?
  2. Which tables use bulk actions, and which of those use custom providers or API Platform rather than scoped Doctrine selections?
  3. Who consumes exported CSV/XLSX, and do any of those consumers parse by column position or expect raw (unformatted) values?
  4. Is Mercure in production, and are any tables configured withCredentials with custom publishers today?
  5. How many tables depend on column index ordering, persisted layout state, or the default search box / page-length selector being displaced by buttons?
  6. Do we have regression coverage on money editing and boolean filter results?
  7. What Symfony and DBAL versions are pinned, and does the symfony/serializer requirement collide with an existing constraint?

Integration Approach

Stack fit

  • Confirm framework reality before any planning: this is Symfony UX. In a Symfony 6.4/7.x app with Twig, Doctrine, and Stimulus, it slots in natively. In a Laravel app it does not integrate — the Laravel analogue (Livewire + a datatables package) should be evaluated instead, and this ticket closed.
  • Assuming Symfony: the bundle complements rather than replaces our query layer. Value formatting belongs in the column definition; authorization stays in customizeQueryBuilder() and per-row permissions. The security docs explicitly place Ajax route protection and per-row permissions on the application — that ownership boundary must be accepted up front.

Migration path

  • Treat 1.1.x as the safe pin. Upgrade on a branch against the demo app plus our highest-risk table first (one with bulk actions, exports, and money columns).
  • Walk the v1.2 upgrade guide as a checklist, in this order: export output → money form submissions → locale defaults → boolean filters → selection-column ordering offsets → modal confirmations → private Mercure subscriptions. Each is an independently verifiable behavior change.
  • Adopt the new patterns now to avoid a 2.0 cliff: replace ColumnResolver::removeDeniedColumnValues() with deniedColumnPaths() + removePaths(); delete deep imports of filterFeature.js, filterLayout.js, bulkActionsFeature.js, bulkActionsLayout.js (the controller installs both bars automatically); replace confirmBulkAction() with confirmAction().

Compatibility

  • Add symfony/serializer explicitly; do not rely on transitive resolution.
  • Add openspout/openspout only for tables that actually need server-side CSV/XLSX — keep it out of the global require if exports are a narrow use case.
  • Verify DBAL 3 paths if we haven't moved to DBAL 4: the release explicitly claims DBAL 3 compatibility for converted/binary identifiers, joined pagination, and export chunking.
  • Verify the Symfony version against the 8.2 route-loader deprecation, and align the npm package to 1.2.0 with a rebuilt, republished asset set and cache-bust.

Sequencing

  1. Framework confirmation and go/no-go (stop if Laravel-only).
  2. Dependency and lockfile audit (symfony/serializer, openspout, DBAL, Symfony ceiling).
  3. Security review: enumerate every table's provider, confirm scoped Doctrine selection or handler-level scope, then decide on ScopedIdentifierProviderInterface adoption for custom providers.
  4. Mercure review: confirm subscriber JWT authorizes the topic; inventory custom publishers and replace or implement PrivateUpdatePublisherInterface where tables are private.
  5. Staging upgrade with the demo app as behavioral reference; diff export files byte-for-byte against 1.1.x output for a representative table.
  6. Regression pass on money editing, boolean filters, ordering offsets, and confirmation flows (including modal-cancel and duplicate-submit).
  7. Frontend rebuild, asset publish, then production rollout behind a feature flag per table.

Operational Impact

Maintenance

  • Two deprecation tracks are now visible: four frontend deep imports, ColumnResolver::removeDeniedColumnValues(), and confirmBulkAction() are on a 2.0 removal clock. Budget cleanup work in the current cycle rather than deferring to the upgrade.
  • Frontend/backend version coupling (npm package version-aligned to the PHP release) means every bump requires an asset rebuild and publish — add this to the standard upgrade runbook so it isn't discovered in production.
  • The bundle ships fast-moving minor releases with security content; expect to track releases rather than pin indefinitely.

Support

  • Open-source, self-supported: no vendor SLA. Security documentation explicitly assigns Ajax route protection and per-row permissions to the application team, so we own a portion of the threat model regardless of the bundle's hardening.
  • Mercure is a live infrastructure dependency with its own operational surface (JWT issuance and topic authorization, reconnect behavior). The Stimulus reconnect / history-listener fixes suggest this area has been historically fragile — monitor it post-upgrade.
  • Internal support load concentrates in two places: table authors misapplying formatting semantics (formatted vs raw), and bulk-action handlers assuming the framework enforces scope when it may not.

Scaling

  • Performance work in this release is directly relevant at scale: reusing the total count when the filtered count query is equivalent, evaluating static column permissions once per row pipeline, SQL-bounded identifier pagination, DISTINCT root-entity paging for to-many joins (which previously produced short, overlapping pages — a correctness bug at pagination boundaries), and appending the identifier to break ordering ties.
  • Server-side exports are chunked, but XLSX generation via openspout is memory- and CPU-bound on the worker; large exports should be queued, not request-bound.
  • Grouped queries, composite identifiers, and unsupported query shapes fall back to existing paths — those tables will not get the pagination improvements and should be inventoried as known-slower.

Failure modes

  • Cross-tenant data leak via bulk selection on a provider without ScopedIdentifierProviderInterface and without handler-level scope. Highest-severity, lowest-visibility failure in this release.
  • Private data published to a public Mercure topic because an existing publisher only warned instead of failing closed.
  • Financial misstatement in exports where money columns are now emitted in currency units but a downstream parser still expects cents.
  • Silent filtering drift from TernaryFilter comparing true/false where NULL semantics were assumed.
  • Wrong-column sorting from stale numeric ordering indexes after the selection-checkbox offset change.
  • Broken confirmation UX where a custom modal adapter doesn't implement the expected contract; native fallback masks the problem in dev but looks inconsistent to users.
  • Duplicate bulk submissions were addressed, but the cancel path (releasing the action bar) and pending-confirmation states deserve explicit test coverage since they were recently defect-prone.

Ramp-up

  • The demo/ Symfony app is the single best onboarding asset — it exercises formatting, filters, layouts, bulk actions, exports, row events, and theming in a runnable form. Make "run the demo, then reproduce one of our tables in it" the first onboarding task.
  • Baseline skills required: Twig, Stimulus/Stimulus controllers, Doctrine query building, and enough Mercure to reason about topic authorization. A mid-level Symfony team should reach productive use in roughly one to two sprints; the security review is the long pole, not the API learning curve.
  • Mandatory reading before authoring a table: the security documentation on Ajax route protection, per-row permissions, and provider-specific bulk selection guarantees. Table authors who skip it are the most likely source of an incident.
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