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 Builder Bundle Laravel Package

happyr/menu-builder-bundle

A Symfony bundle that simplifies creating and managing navigation menus. Define menu items and hierarchies in configuration or code, then render them in Twig templates with a clean, flexible API. Useful for site navigation, admin sidebars, and reusable menu structures.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. Unchanged. happyr/menu-builder-bundle remains a Symfony bundle, not a Laravel package: it integrates through Symfony's DI container, bundle registration, and (almost certainly) KnpMenu as the menu model. Laravel offers no bundle concept, and the repository still ships no service provider, facade, or config stub. Fit as shipped is effectively zero; fit as a reference implementation remains moderate, since menu construction is a thin, well-understood concern.

Integration feasibility. The release marginally improves the feasibility picture without changing the conclusion. PHP 8 support removes one class of install-time breakage — the assessment previously assumed php ^7.x|^8.0 constraints and flagged --ignore-platform-reqs as likely. That specific workaround may no longer be needed. The harder blocker is untouched: Symfony component constraints. Laravel 10/11 pin Symfony ^6/^7; a 2021-era bundle will declare symfony/* ^4|^5, and this release does not claim otherwise. A fork or constraint widening is still expected. Both original paths remain valid: (1) Composer install plus a hand-written Laravel ServiceProvider and config bridge, or (2) reimplementation / adoption of spatie/laravel-menu. Path 2 remains the better default.

Technical risk. Still high, but the risk profile has shifted slightly rather than improved. Positives: the package is not dead — a maintainer shipped a release, and PHP 8 compatibility is now asserted. Negatives: the ecosystem signals are unchanged (2 stars, 0 dependents, composite score 0.21), and one patch release after a multi-year gap is not a maintenance cadence, it is a pulse. Two additional concerns surfaced by this release. First, PHP 8 support is unspecified — "PHP 8" could mean 8.0 (EOL) rather than 8.1/8.2/8.3, which are what Laravel 10/11 actually require. Second, shipping new functionality (active method) in a patch-level 0.2.1 bump signals loose semver discipline, which makes future upgrades harder to reason about. The code itself remains small and low-risk; the supply chain around it does not.

Key questions.

  • Which PHP 8 minors are actually supported and tested — 8.0 only, or 8.1+? This determines whether Laravel 10/11 is even nominally in range.
  • Were the Symfony component constraints widened in this release, or only the PHP constraint? The release notes mention PHP 8 and nothing about Symfony.
  • Is the active method a per-item flag on the menu model, or does it resolve against the current request/route? The latter implies request coupling that is more work to port into Laravel's routing context.
  • Does the bundle still do nothing beyond wrapping KnpMenu with config-driven construction? If so, its value is a few hundred lines we can own outright — now including the active logic.
  • Is menu structure stored in config, attributes, or a database table? This drives porting effort.
  • What is the actual requirement — static nav, permission-aware menus, or CMS-editable trees? This still likely rules the package in or out on its own.

Integration Approach

Stack fit. Poor natively, acceptable as a pattern. Nothing in this release changes the translation work: container bindings become service provider registrations, bundle config becomes config/menu.php, Symfony event-dispatcher hooks become Laravel events or middleware. The new active method will need to be rebound to Laravel's request/router if it is request-aware.

Migration path. Sequence is largely intact, with one step made cheaper: audit the 0.2.1 source diff first — it is small and will answer the PHP-version and Symfony-constraint questions directly, without a spike. Then run the timeboxed Composer install against the target Laravel version. The decision rule is unchanged: since the package is small, reimplementation is usually cheaper than sustaining a fork, and the active-method addition does not change that arithmetic — it is a few more lines to port, not a reason to inherit a dependency.

Compatibility. Improved at the PHP layer, unchanged at the framework layer. Verify the resolved dependency graph in a throwaway branch; expect Symfony major-version conflicts to persist and still require a fork or constraint widening. Check the composer.json require block in 0.2.1 rather than trusting the release note. Confirm PHP 8.1+ is genuinely covered; "PHP 8" alone does not guarantee it. Keep CI coverage pinned to the PHP versions we actually deploy.

Sequencing. (1) Requirements clarification on menu complexity. (2) Read the 0.2.1 diff and composer.json — a few hours, not a day. (3) Composer feasibility spike, timeboxed. (4) Build-vs-adopt decision, documented. (5) If adopting, implement behind an internal MenuBuilder interface so the implementation stays swappable. (6) If reimplementing, ship config-driven menus first, then active-state resolution, and defer dynamic/persisted menus.

Operational Impact

Maintenance. We would still own it. A single release after a multi-year gap does not constitute upstream maintenance: no evidence of a support commitment, no regular security patching, no tracked compatibility work beyond PHP 8. The PHP 8 support is a one-time catch-up, not a durable guarantee. Budget for a named owner if forked; budget near-zero ongoing cost if reimplemented natively — still the stronger argument.

Support. Effectively community-only and dormant. One responsive maintainer event is not a triage process, and a 2-star, zero-dependent repository will not attract one. Internal documentation will still have to be written from source. The release notes are a single sentence with no changelog detail, which is itself a support signal.

Scaling. Runtime cost remains negligible; menu construction is cheap and should be cached via config cache, view cache, or a short-TTL cache for dynamic menus. The active method adds a small per-request cost if it resolves against the router — measure only if menus grow large. The real scaling risk is unchanged and organizational: an unmaintained dependency accumulating across services and blocking framework upgrades.

Failure modes. Symfony constraint resolution failures on framework upgrades (the dominant risk, untouched by this release); misreading "PHP 8 support" as covering the 8.1–8.3 range Laravel requires; silent ordering or permission-filtering regressions after a PHP bump; breaking API changes arriving in future patch releases given the semver looseness demonstrated here; fork abandonment when the owning engineer leaves; hidden coupling if menu logic leaks into Blade templates instead of staying behind a service boundary.

Ramp-up. Slightly reduced. Low for a developer with Symfony DI familiarity (hours to read the source). Moderate for a Laravel-only team — previously one to three days for spike plus port; the PHP 8 support trims the low end of that estimate but the port itself is unchanged. Porting the active method into Laravel's request lifecycle adds a small amount of work if request-aware. Higher again if permission-aware menus are in scope.

TPM recommendation. Unchanged. Do not take a production dependency on this package. The 0.2.1 release is a positive signal but a weak one: it fixes a compatibility gap and adds a minor feature without addressing the framework-constraint problem that actually blocks Laravel adoption. Use it as a design reference — the active implementation is worth reading — or adopt a maintained Laravel-native menu library, and wrap whichever choice behind an internal interface so the decision stays reversible. Revisit only if the package establishes a sustained release cadence and widensed Symfony constraints.

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