biostate/filament-menu-builder
A drag-and-drop menu builder for Filament panels. Create and manage nested navigation menus visually, add custom links or model-based items, reorder entries easily, and integrate flexible, configurable menus into your Laravel app.
Architecture fit. biostate/filament-menu-builder is a Filament panel plugin that provides an admin-side menu composer backed by kalnoy/nestedset. It occupies the "content navigation" slot in a Laravel + Filament stack: hierarchical menu records persisted with nested-set columns (_lft/_rgt/parent_id/depth), edited through a Filament UI, and rendered into Blade/front-end output. It is an application-layer package, not infrastructure — no queue workers, no external services, no runtime daemon. It fits cleanly wherever a Filament admin panel already exists and menus are currently hard-coded or modelled with a naive parent_id tree.
Integration feasibility. Low-friction. v5.1.0 is a minor release whose only runtime change is a widened Composer constraint; everything else is CI, test-toolchain and static-analysis housekeeping. It resolves the install conflict reported as issue #31 (Laravel 13 + nestedset v7), which was previously a hard blocker for anyone on the Laravel 13 line. Integration surfaces are conventional: composer require, plugin registration on the Filament panel, published migrations/config, and a nested-set-enabled model. No bespoke service container wiring or event contracts are implied by the release.
Technical risk.
nestedset v6 → v7 is a major-version jump gated on Laravel 13. The package does not control that library's API surface. Behavioural or signature changes in tree manipulation (moveTo, sibling ordering, scope semantics) would surface inside this plugin first. Treat the Laravel 13 path as "supported by constraint, unproven in our codebase" until exercised.BladeCaptureDirectiveServiceProvider registration confirms a hard dependency on Filament v5 behaviour. Filament v4 (or earlier) consumers are outside the tested support envelope; the release does not claim otherwise, but it also does not state a floor.Key questions.
nestedset v7 that affect this plugin's tree operations, and is there a migration note for existing v6-backed data?pcov driver change, or was it dropped in favour of failOnWarning stability?Stack fit. Targeted at Laravel 11+ with Filament v5 on PHP 8.2+ (8.3+ for Laravel 13). If our admin panel is already Filament-based, the plugin is additive and does not perturb existing panel configuration. If we are not on Filament, the cost is not this package — it is adopting Filament, and this package should not be the thing that forces that decision.
Migration path. v5.0.4 → v5.1.0 is a minor bump with no data migration, no config key renames, and no published-asset changes. Composer will resolve nestedset v6 on Laravel 11/12 exactly as before, so existing installs are byte-for-byte unaffected at runtime. The only reason to take it deliberately is to unblock Laravel 13. For a Laravel 13 migration specifically, sequence the framework upgrade first, then this package, then verify tree integrity against the new nestedset major.
Compatibility. Two independent axes to pin: Laravel (11/12/13) and PHP (8.2/8.3+). Laravel 13 × PHP 8.2 is explicitly untested and should be excluded by a Composer platform constraint. Downstream, confirm our own Filament version resolves against the plugin's declared range before scheduling work — this is the most likely place a "supported" claim fails in practice.
Sequencing.
nestedset v7 changelog, PHPStan baseline diff, maintainer activity.Maintenance. The release signals healthy engineering hygiene more than new capability: a three-version Laravel CI matrix, PHPStan and Pint enforced on pull requests and on dependency-manifest changes, dev constraints widened so the toolchain resolves across every matrix cell, and fail-fast disabled to surface the full failure set. That is a maintainer investing in the boring parts. The counterweight is that all of it is test-infrastructure work — the shipped runtime delta is one Composer constraint. Judge the package on its issue response time and release cadence, not on this changelog.
Support. Single-vendor, and likely small-team. Budget for the possibility that a nestedset v7 regression is fixed upstream on their schedule rather than ours. Mitigation: keep the tree-manipulation surface behind a thin application-level service so a swap or a local patch is contained, and vendor-fork readiness is a decision we make before we need it.
Scaling. Nested-set reads are cheap — a whole menu tree is one indexed range query, which is exactly right for a render path hit on every page. Writes are the concern: insert, move, and delete rewrite _lft/_rgt ranges across affected rows, so reordering a large menu is an O(n) update inside a transaction. For realistic menu sizes (tens to low hundreds of nodes) this is a non-issue. For very large or frequently reordered trees, expect lock contention and possible deadlocks under concurrent admin edits. Reads dominate, so cache the rendered menu aggressively and invalidate on write.
Failure modes.
_lft/_rgt, or items vanishing from the tree view. All mutations must be transactional; schedule a periodic integrity check (the nestedset package ships check/repair commands) and alert on mismatch.nestedset v7 alters tree semantics; caught only by an explicit post-migration tree assertion.BladeCaptureDirectiveServiceProvider registration is test-only and does not change runtime behaviour, but it confirms the render path is coupled to Filament v5 internals. Pin the Filament version rather than floating it.Ramp-up. Low for anyone who has used Filament — the admin UI is conventional, and there is no new runtime concept to learn beyond registering the plugin and publishing assets. The one genuine learning curve is nested-set semantics for developers who will write against the model directly: _lft/_rgt are not intuitive, and hand-editing rows outside the provided tree API is how corruption happens. Document that the tree API is the only sanctioned write path, and that direct SQL against these columns is prohibited. Estimate half a day for a Filament-fluent developer to ship a working menu, plus an hour of team briefing on the nested-set invariants.
How can I help you explore Laravel packages today?