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

Nova Menu Builder Laravel Package

outl1ne/nova-menu-builder

Flexible menu builder for Laravel Nova. Create and manage hierarchical menus with an intuitive drag-and-drop interface, supporting custom links, model references, and nested items. Attach menus to models and render them on your frontend with ease. Everything you need for simple, powerful menu manage...

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. This is a Nova tool, not a general Laravel package. Its value is entirely contingent on already running a licensed Laravel Nova v4/v5 instance; the package is a thin admin layer over two Eloquent models (Menu, MenuItem) plus a config file. That is a favorable fit for a TPM: the data model stays in the application's database, rendering stays in the application's Blade/API layer, and only the editing UI is vendor-supplied. The integration surface is unusually small and well-bounded — config/nova-menu-builder.php (menu_item_types, locales, menu_model, menu_item_model, nova_resource) plus the formatForDisplay() serialization method. Everything the frontend consumes is ours to shape, which keeps the admin tooling swappable and means the package is not load-bearing for customer-facing output.

Integration feasibility. High for a team already on Nova, low-to-moderate otherwise. Required work is bounded and well understood: composer require, publish provider assets, php artisan migrate, define menus, write one recursive Blade partial, and wrap data access in a helper or view composer with caching. Custom link types extend BaseMenuItemType and are registered in config — no vendor edits required. The credible scope is header, footer, utility/legal links, sidebar and documentation trees, mobile variants, and per-locale menus. All of these exercise existing capability, which makes the estimate defensible in a planning session.

Technical risk. The risks are concentrated and predictable rather than architectural:

  • Framework coupling. The package tracks a closed-source commercial framework. Nova major upgrades must be treated as planned work with a named owner, not a routine composer update. MIT licensing means forking is legal; Laravel depth makes it practical but not free. Pin both majors explicitly.
  • Cache invalidation is our responsibility, not the package's. Menus render on every request but change rarely. Without saved/deleted listeners on both models (item reorders fire saves), editors will report "my change didn't show up." This is the single most likely source of avoidable support load.
  • Config-cache invisibility. New item types or locales silently fail to appear after editing config until config:clear/config:cache is re-run — no error, just a missing option in the builder modal.
  • Orphaned links. Model-linked items break when the target is deleted. The behavior on delete (cascade the menu item vs. render a fallback) is a decision we must make up front; undecided equals broken navigation in production.
  • Permissive default resource. The default Nova resource is open. Navigation editing authority must be locked down with a policy early rather than retrofitted.
  • Maturity signals. 242 stars, zero dependents, and a recent patch (7.1.10 fixes top-level reorder downwards) indicate an actively maintained but narrowly adopted package with limited community backstop. Bus factor is real; treat this as code we own.

Key questions for the team:

  1. Are we licensed and running Nova v4/v5, and does the package's composer.json constraint match our major today?
  2. Who is the named maintainer accountable for Nova upgrades and vendor patching, and what is the upgrade cadence expectation?
  3. Which link types are we shipping — model references, free URLs, or both — and what is the defined behavior when a linked record is deleted or unpublished?
  4. Are locales in scope, and if so does each locale get its own tree, or one tree with translations and fallbacks? Who approves translations?
  5. Who may edit navigation (admins only, marketing leads, all editors), and does that require formalizing a content-role model?
  6. Do we need publish workflows, scheduling, audit history, or multi-tenant isolation — any of which pushes us past what a Nova resource provides?

Integration Approach

Stack fit. Requires Laravel with Nova v4/v5; assumes MySQL/Postgres via standard migrations and no exotic runtime dependencies. The package provides admin CRUD and ordering UI; the application owns routing, rendering, caching, and the payload contract. Frontend consumption is either a recursive Blade partial over the formatted tree or a small controller endpoint for SPA/mobile/partner consumers. In both cases the serialized shape is ours to stabilize, which is the key property for multi-consumer roadmap items.

Migration path. Greenfield adoption is trivial: publish, migrate, create main-menu, seed it, render. Brownfield — replacing hardcoded nav markup or a hand-rolled menu table — should follow a shadow-then-cutover pattern: build menus in Nova behind a feature flag, render both old and new nav in staging, diff the output, then flip. Migrating existing hardcoded links into menus is manual work best done by the content owner, not engineering; budget it as an editorial task with an engineering-defined item-type set. If a prior menu table exists, a one-time mapping script into menus/menu_items is usually cheaper than parallel maintenance, but only worth it above a few dozen links.

Compatibility. Two hard constraints: the Nova major and PHP/Laravel versions implied by the package's composer.json. Everything else is soft. Custom models and the Nova resource are overridable via config, so soft deletes, accessors, stricter policies, and tenant scoping can be layered without forking. The remaining compatibility surface is our own: slug casing (main-menu vs main_menu vs mainmenu will collide in practice — standardize in the helper and consider a unique index in a follow-up migration), and the actual shape returned by formatForDisplay(), which varies by item type and should be verified by dumping a real tree rather than trusting the README.

Sequencing. Recommended order, each step independently shippable:

  1. Verify Nova constraint and license; pin both package and Nova versions.
  2. Install, publish, migrate; set menu_item_types and locales in config; clear config cache.
  3. Ship bundled LinkItem/TextItem and one menu (main-menu) with a seeded tree — validate the end-to-end loop before customizing.
  4. Add the helper/view composer with caching plus model event listeners for cache busting. Do this before handing the UI to editors.
  5. Add MenuPolicy and lock down access; define the editor role.
  6. Build one recursive Blade partial and cut over header; then reuse for footer and sidebar.
  7. Introduce custom item types (Page, Product) with getRules() and getDisplayValue(), plus the delete-behavior decision from the key questions.
  8. Only then expand to locales and API consumers, if on the roadmap.

Do not sequence custom item types or locales before the caching and policy layer — both amplify the cost of getting freshness and permissions wrong.

Operational Impact

Maintenance. Low steady-state, spiky at Nova upgrades. The codebase we own is small: one partial, one helper, a policy, a seeder, optionally one or two BaseMenuItemType subclasses, and config. The real maintenance obligation is the Nova coupling — assign a named owner and schedule upgrade evaluation as planned work each time Nova majors. Keep vendor code untouched (use the config override triangle: nova_resource/menu_model/menu_item_model, getDisplayValue(), and model event listeners) so updates remain cheap. The package is MIT and forkable, which limits lock-in risk, but a thin community (242 stars, zero dependents) means we should not rely on upstream for non-trivial fixes.

Support. Support load is predictable and mostly editorial, not technical. Expect two recurring classes of ticket: "my change didn't appear" (cache invalidation — solved structurally by the event listeners, not by training) and "this link is broken" (orphaned model references or free-URL rot — solved by policy on link typing and delete behavior). Ship a short editor runbook covering drag-and-drop semantics — deleting or moving a parent mutates order and parent_id destructively, and manual DB edits leave the builder showing a stale tree until refresh. Require all ordering changes to go through the UI. Escalation to engineering should be limited to new item types and rendering changes; that boundary is worth stating explicitly so it is enforceable.

Scaling. Rendering scales well if the formatted tree is cached rather than re-queried per request. The naive $menu->items → ->children chain N+1s badly on deep trees; caching the formatted array sidesteps this and is the preferred pattern over per-request eager loading. Beyond that the volume characteristics are trivial — menus are small, low-cardinality data. The genuine scaling limits are functional, not performance: the package does not provide publish windows, scheduling, A/B or segment-based navigation, merchandising slots, audit trails, or tenant isolation. If the roadmap calls for any of those, we will be building a bespoke system on top of a thin base, and that should be scoped as a separate project rather than an extension of this integration.

Failure modes. Ranked by likelihood and blast radius:

  1. Stale navigation after edits — cache keys not busted on save/delete/reorder. Highest frequency, visible to end users, fully preventable.
  2. Broken links to deleted records — no defined delete behavior. Prevents with an observer cascade or a getDisplayValue() fallback; without one, produces customer-visible 404s.
  3. Silent config regression — new item types or locales absent after a deploy because config:cache ran against stale config. No error surfaces; the option simply disappears from the modal.
  4. Nova upgrade breakage — package incompatible with a new Nova major; admin navigation editing goes down while the public site keeps rendering (a contained but high-visibility outage).
  5. Validation/field mismatch in custom types — getRules() referencing a data. key that getFields() does not write; items save successfully but render blank. Debug at the model layer, not in the Nova UI.
  6. Unauthorized edits — permissive default resource without a policy; low likelihood once a policy ships, high consequence if it never does.

Ramp-up. Fast for a Laravel developer familiar with Nova: roughly a day to first rendered menu, two to three days to a hardened setup (caching, event listeners, policy, seeded menus, editor runbook). A developer new to Nova should add a day. Editorial ramp-up is a short walkthrough plus the runbook — the drag-and-drop UI is the least of the training burden; the concepts that actually need teaching are link typing (model reference vs. free URL), locale scoping if enabled, and the fact that destructive tree edits take effect immediately for visitors once cache clears. Recommended exit criteria for the pilot: header and footer both editor-managed, cache busting verified end to end, policy enforced, and zero engineering involvement in a routine navigation change.

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.
mrnewport/laravel-plaid
mrnewport/laravel-repo
mrnewport/laravel-docsign
mrnewport/laravel-stow
mrnewport/laravel-flow
mrnewport/laravel-priceable
mrnewport/laravel-nestedterms
fredmeng/laravel-apidoc-generator
itstructure/laravel-multilingual-tools
pdustdar/elasticsearch
markupai/php-sdk
rlacerda83/lumem-microservice-shipment
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle