zenstruck/dashboard-bundle
A Symfony bundle from zenstruck for adding dashboards to your application. It provides building blocks to assemble dashboard pages that surface your app's data in one place, following standard Symfony conventions. Suited to admin panels and internal tools.
Architecture fit — low. The first thing to flag is a category mismatch: zenstruck/dashboard-bundle is a Symfony 2 bundle, not a Laravel package. It exposes a Bundle subclass registered through AppKernel, wires services via Symfony's DI container and Extension classes, and hooks into Symfony's kernel.event_listener and menu builder conventions. Laravel has no native concept that maps onto any of this. Adopting it would mean either (a) running a Symfony kernel alongside Laravel's HTTP kernel — a two-framework architecture with duplicate containers, autoloaders, and config systems — or (b) forking and reimplementing the widget/menu abstractions as Laravel service providers, at which point you are writing the package rather than integrating it.
Integration feasibility — very low. The last tagged release is 2013-12-11, which places it in the Symfony 2.2–2.4 / PHP 5.3–5.4 era. Realistically it will not install on PHP 8.x or Symfony 5+/Laravel 10+ without patching. Expected breakages include:
symfony/symfony ~2.x and transitive deps (knp-menu, twig/twig, assetic) that resolve to versions with known CVEs.each(), getMock(), dynamic property creation, createMock signature drift).ExtensionInterface / CompilerPassInterface signature changes that break container compilation outright.%kernel.root_dir%-style parameters that no longer exist.Technical risk — high, and mostly uninsurable. Zero dependents and 3 stars means no downstream users are exercising the code path, so there is no community-derived bug surface to learn from and no one to answer questions. There has been no release in ~12 years, so there is no security-response channel. The bundle also owns a privileged surface: an admin menu and dashboard are typically the entry point to privileged actions, so an unpatched, unreviewed auth-adjacent component is a poor place to accept risk.
Key questions for stakeholders:
Bottom line: score 0.175 with an opportunity score of 24.73 reflects a package that is technically dead and strategically irrelevant to a Laravel codebase. Recommend reject for adoption and treat it only as a design reference for the widget-registry pattern.
Stack fit — none out of the box. A Laravel 10/11 target on PHP 8.2/8.3 shares only Composer and PSR-4 with this bundle. There is no service provider, no facade, no config publishing, no Blade views, and no Laravel-native menu abstraction. Any integration is greenfield code wearing the package's name.
Migration path (if the capability is genuinely required):
composer require in a throwaway Laravel 11 app with --ignore-platform-reqs, and time-box an install attempt. The expected outcome is a dependency-resolution failure at symfony/symfony ~2.x. Document the failure — this is the artifact that closes the question cheaply.DashboardServiceProvider registering a WidgetRegistry singleton, a MenuBuilder driven by a config/dashboard.php file, and Blade components for rendering gets you parity in days, on a stack you can patch.Compatibility. Do not attempt a side-by-side Symfony kernel bridge unless there is a hard, documented requirement to preserve an existing Symfony admin surface. That architecture doubles your container, config, and debugging surface permanently to support one dashboard.
Sequencing. Gate the work behind a written requirements check: if the only requirement is "an admin dashboard with some widgets," skip straight to step 3 or 4. Reserve engineering time for a port only if a specific, named feature of this bundle is unambiguously required and unavailable elsewhere — which the 2013 feature set (static menu config, Twig widget partials) makes unlikely.
Maintenance. Effectively infinite relative to value. You inherit ownership of a frozen PHP 5-era codebase with no upstream to rebase against. Every PHP minor bump becomes your problem; every Twig, Symfony, or Composer change is a potential break with no fix to pull. If you fork, budget ongoing maintenance as if you had written it — because you have.
Support. No maintainer activity since 2013, no documentation beyond the README, and 0 dependents means no Stack Overflow corpus, no issue history to mine, and no community to escalate to. Internal support would rest on whoever performed the port, which is a single-point-of-failure on a low-value subsystem — a bad ratio.
Scaling. The 2013 design renders widgets synchronously per request with per-widget Twig partials and no caching layer, no lazy/deferred widget loading, and no per-widget failure isolation. On a dashboard that aggregates N widgets each hitting the database, response time scales linearly with widget count, and one slow widget degrades the entire page. Modern equivalents (Livewire lazy components, Filament widget polling) solve this; this bundle does not.
Failure modes to expect:
Ramp-up. Deceptively high for a small package. An engineer must context-switch into Symfony 2 idioms — DI extension classes, bundle registration, compiler passes, Assetic — to read code that will ultimately be discarded. The learning investment produces no reusable skill for the team's actual stack. Contrast with a native Laravel implementation, where ramp-up is near zero and the output is maintainable by the whole team.
Recommendation. Do not adopt. Close the evaluation with the install-attempt spike as evidence, extract the widget/menu configuration pattern as an internal design note, and satisfy the requirement with Filament/Nova or a small in-house WidgetRegistry + MenuBuilder pair. The package's only defensible use is as a historical reference for how to model configurable dashboard widgets.
How can I help you explore Laravel packages today?