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

Menu Bundle Laravel Package

nucleos/menu-bundle

A Symfony bundle for building and rendering menus from a fluent PHP API, with support for nested items, attributes, translation, current-item matching, and Twig rendering. Configure menus in services and output accessible markup.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Premise check (still stands): nucleos/menu-bundle is a Symfony bundle, not a Laravel package. It ships a Symfony Bundle class, a DI extension with a config tree, and container-wired services. The Laravel framing in the original brief remains invalid and should be corrected upstream.

What changed in 2.9.0

  • Symfony 8 support added (PR #526). This is a dependency-compatibility release, not a feature release despite the "minor" version bump.
  • symfony/phpunit-bridge bumped to v8 (PR #520) — consistent with an active CI matrix now including Symfony 8.
  • Zero issues resolved, two PRs, two contributors. No API changes, no new capabilities, no deprecations announced in the notes.
  • The 2026-04-03 date flagged as a possible metadata artifact in the prior assessment is now corroborated — the release notes carry the same date and link a real milestone and PR numbers. Downgrade that concern from "verify" to "resolved."

Architecture fit

  • Unchanged: narrow, well-defined purpose — config-driven static menu definitions exposed as container services. A definition layer, not a rendering framework.
  • Symfony-idiomatic and now demonstrably keeping pace with the framework's release train, which is the single most important architectural property for a bundle this thin.
  • Against Laravel: still poor, for the same structural reasons. Nothing in 2.9.0 alters this.

Integration feasibility

  • Symfony 6/7/8 (pending constraint verification): composer require, register in bundles.php, add config. Hours.
  • Laravel: still not a drop-in. Reimplement the pattern natively or adopt a Laravel-native package.

Technical risk — revised

  • Fit risk: high relative to a Laravel target; unchanged.
  • Maturity risk: medium (down from high). Still 6 stars / low dependents — no downstream battle-testing — but 2.9.0 is direct evidence of a maintainer responding to a framework major within the normal window. That is the exact failure mode we were worried about, and it did not materialize.
  • Bus factor: still 1 effective maintainer (core23), with Renovate handling the mechanical dependency updates. The bot is doing real work here; do not mistake bot PRs for maintainer depth.
  • Version-constraint risk: reduced but must be verified. Key unknown: did PR #526 widen the constraint to ^6.4|^7|^8, or did it replace older majors? Many bundles drop EOL Symfony versions when adding a new one. If Symfony 6 support was dropped in a minor release, that is a semver violation with real upgrade consequences for us.
  • Date anomaly: resolved. Metadata is internally consistent across the milestone, PR links, and release notes.
  • License/legal risk: low. MIT, unchanged.
  • Opportunity score: the low strategic-upside read is unchanged — this remains commodity plumbing.

Key questions before committing (revised)

  1. Does the 2.9.0 composer.json constraint add Symfony 8 or replace earlier majors? This is now the top question — check the diff on PR #526 directly. A minor-version drop of Symfony 6 support would be a breaking change shipped without a major bump.
  2. What is the minimum PHP version after the bump? Symfony 8 requires PHP 8.4, but the bundle's floor may or may not have moved with it.
  3. Does CI actually run against Symfony 8, or is the phpunit-bridge bump ceremonial? Look for the matrix, not the dependency.
  4. Does it wrap KnpMenuBundle or stand alone — i.e., do we inherit a second dependency's maintenance risk? (Carried over, unanswered.)
  5. How "static" is static — pure config, or runtime/permission-aware mutation? (Carried over, unanswered.)
  6. Release cadence over 24 months, now with 2.9.0 as a data point. One responsive release does not make a track record.

Integration Approach

Stack fit

  • Symfony: green, and greener than before — a maintained path to Symfony 8 removes the "scheduled migration" objection for at least one major cycle.
  • Laravel: red. Unchanged. Do not shim.

Migration path (Symfony target)

  1. Pin to 2.9.0 explicitly, not ^2.9. Confirm the constraint diff from Q1 before merging.
  2. Feature-branch install; do not co-mingle production menu config with the dependency PR.
  3. Move menus into the bundle's config format one at a time; keep the render layer as the boundary.
  4. Delete the legacy registry only after per-menu parity is verified.

Migration path (Laravel target)

  • Unchanged: treat the package as a reference implementation, not a dependency. config/menus.php + a MenuBuilder singleton + a Blade component is a day of work and eliminates the single-maintainer exposure entirely.
  • If a package is preferred, evaluate spatie/laravel-menu first.

Compatibility

  • Re-verify the PHP floor and the Symfony floor/ceiling post-2.9.0. The release was about constraints; do not assume the constraint set is a superset of 2.8.x.
  • Check symfony/dependency-injection and symfony/config alignment specifically — these are where the conflict surfaces.
  • If we are still on Symfony 6.x, confirm 2.9.0 has not stranded us before adopting.

Sequencing

  1. Constraint diff review (30 min): read PR #526. Cheap, and it is the only question that can invalidate the whole track.
  2. Spike (0.5 day): throwaway Symfony app, two menus, confirm rendering and cache warmup on our target Symfony version.
  3. Boundary design (0.5 day): our own MenuProvider interface so the bundle sits behind an adapter. Still the highest-value step; 2.9.0 reduces the abandonment risk but does not eliminate it.
  4. Pilot (1–2 days): one non-critical menu behind a flag.
  5. Rollout: remaining menus, then retire the legacy registry.
  6. Laravel track: skip to the native port, unchanged.

Operational Impact

Maintenance

  • Materially improved signal: a framework-major compatibility release landed inside the normal window, which is the single best proxy we have for "this will not block our Symfony upgrade."
  • Still pin exact versions. Low adoption means nobody else finds the regressions for us.
  • Add a recurring check tied to the Symfony release train — but treat it as a confirmation step now rather than a contingency.

Support

  • Community-only, no SLA, no security disclosure process. Unchanged. Acceptable for static menu definitions (near-zero attack surface, no external input parsing); not acceptable for anything touching auth or user data.
  • Note the release was driven partly by Renovate. Automated dependency PRs are good hygiene but are not the same as a maintainer actively developing the package.

Scaling

  • Unchanged and unexciting, which is the point: menus compile into the DI container and cache. Negligible CPU/memory at any realistic scale. No database, no network call, no external service.
  • Config sprawl remains the only real scaling concern — split per-domain config files early.

Failure modes (revised)

  1. Constraint regression — 2.9.0 dropped a Symfony major we still run, shipped as a minor. New top failure mode. Mitigation: read the diff, pin exact, assert our Symfony version in CI.
  2. Abandonment — downgraded likelihood given 2.9.0, but bus factor is still 1. Mitigation: the adapter boundary.
  3. Silent config schema drift — minor-version config key changes producing unnoticed menu changes. Mitigation: structural assertions on menu output, not just smoke tests.
  4. Supply chain — low-star transitive dependency as a soft target. Mitigation: lockfile pinning, Composer audit in CI.
  5. Premise failure — attempting Laravel integration mid-sprint. Mitigation: settle the stack question before code.

Ramp-up

  • Symfony developer: under an hour. Unchanged.
  • Laravel developer: N/A — the package is not the artifact they would learn.
  • Team-level: negligible onboarding cost either way, which keeps the make-vs-buy decision driven by dependency risk rather than effort.

Recommendation: Adopt on a Symfony stack, conditionally on the constraint check. Run step 1 first — if PR #526 widened the Symfony range to include our current version, adopt behind our own MenuProvider interface at an exact pin with structural tests. If it replaced an older major we still depend on, pin to the last 2.8.x that supports us and revisit at our next platform upgrade. Do not adopt on a Laravel stack — unchanged; reimplement natively or use spatie/laravel-menu. Net movement from the prior assessment: maintenance risk is down one notch on hard evidence, the data-integrity concern is closed, and the remaining risk has shifted from "will the maintainer show up" to "did the constraint bump break our version floor."

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.
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
shitoudev/permissionmanager
johannesclimacus/laravel-tui
hocvt/seotools
vitalybaev/sypexgeo
amphibee/themosis-ignition
gito-me/fast-excel
frankyso/laravel-ipaymu
geolize-studio/laravel-chile
boomerangui/chat
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
cgv/localized-resource