zikula/sortable-columns
zikula/sortable-columns adds reusable sortable column support to Zikula tables, helping developers define sortable headers, generate sort links, and keep column ordering consistent across modules with minimal configuration.
Architecture fit
Poor. zikula/sortable-columns is a micro-component from the Zikula CMS ecosystem, not a general-purpose PHP library. Its job is narrow: produce clickable table column headers that toggle sort direction and carry the correct query parameters. In practice that means it is coupled to Zikula's conventions — module variables, the Zikula service container, legacy request/session helpers, and the Zikula translation layer — rather than to PSR-7/PSR-15 abstractions or plain Symfony components. A Laravel application shares almost no surface area with those assumptions, so adopting the package means importing Zikula's idioms into a Laravel codebase rather than fitting a library to our stack.
Integration feasibility
Low, and not worth the effort. Realistic options:
composer require would likely fail or produce an unresolvable conflict.sort and direction parameter, whitelist against allowed columns, render <a> elements with preserved query string, and render an asc/desc indicator. That is a Blade component plus a small query-scope helper — a day or two of work, fully owned and tested.Technical risk
ORDER BY. Any implementation must whitelist columns server-side; the package's era of PHP makes it unlikely to model that defensively, and copying its approach verbatim would be risky.Key questions
aria-sort semantics? If so, the package's markup is a liability, not an asset.Stack fit
Conceptually compatible, technically incompatible. Laravel's request object, URL::current()/request()->fullUrlWithQuery(), Blade components, and Eloquent/query-builder scopes cover every capability this package offers, with first-class sorting-parameter handling and no framework crossover.
Migration path
There is no data migration — the package holds no state of its own beyond request parameters. The path is behavioural parity, not porting:
sort, direction, or legacy Zikula variants).SortableColumn value object or Blade component that takes column key, label, current sort, current direction, and base URL; emits a link with toggled direction and preserved query string, plus aria-sort and an icon slot.Sortable trait or applySort() macro on the query builder that whitelists columns and directions before orderBy.Compatibility
aria-sort expectations; the reimplementation is an accessibility upgrade, not a regression.Sequencing
Ship the internal component behind a feature flag on one table first, confirm sort state survives pagination and filter changes, then roll out. Treat the archived package as documentation of intent, not as a dependency to install.
Maintenance
Adopting this package converts a two-day build into an indefinite fork-maintenance obligation on an archived, single-star project. Reimplementing keeps the code inside our normal upgrade cadence (PHP and Laravel majors) and inside our test suite.
Support
None available. No maintainer, no issue triage, no security advisories. Any defect becomes an internal ticket with no upstream escalation path.
Scaling
Performance is a non-issue — it is presentation-layer link generation. The scaling concern is the query side: sorting on unindexed or computed columns at volume is a database problem the package does nothing to address. Enforce a whitelist of indexed sortable columns and consider capping sortable sets on large tables.
Failure modes
ORDER BY if column names are passed through from the request without whitelisting — the highest-severity risk in this whole area.Ramp-up
Low either way — the API surface is tiny. The difference is what the team learns: with the package, engineers must learn Zikula's module/request/session idioms that have no reuse elsewhere in our stack; with a reimplementation, they learn our own Blade component and query-scope conventions, which pay off across every table in the product.
How can I help you explore Laravel packages today?