Key features
Tree structure
Items with parent/children relationships, ordered by position. Supports unlimited depth, collapsible nested lists, link items, and section headers.
i18n support
Labels stored as JSON translations per locale. Pass a locale via Twig or the
_locale query param on the API — no extra translation files needed.Context resolution
The same menu
code can have multiple variants distinguished by a JSON context (e.g. partnerId, operatorId). Pass an ordered list of context sets; the first match wins.Permissions
Implement
MenuPermissionCheckerInterface and tag it as a service to filter items per user or context. No-checker menus default to allow-all.Twig rendering
Three Twig functions —
dashboard_menu_tree(), dashboard_menu_config(), and dashboard_menu_href() — plus a ready-made menu.html.twig template you can override.JSON API
GET /api/menu/{code} returns the resolved, permission-filtered tree as JSON for SPA or headless consumption.Dashboard CRUD
Full admin UI at
/admin/menus: create, edit, copy, and delete menus and items. Export and import menus as JSON for backups and environment migrations.Performance
Two SQL queries per menu. Optional PSR-6 cache with configurable TTL and pool. Tree built in PHP — no recursive SQL.
Compatibility
| Requirement | Version |
|---|---|
| PHP | >= 8.2, < 8.6 |
| Symfony | 6.4 (LTS), 7.x, or 8.x |
| Doctrine ORM | ^2.13 || ^3.0 |
Symfony 8.0 requires PHP >= 8.4. With PHP 8.2 or 8.3, Composer resolves to Symfony 6.4 or 7.x. With PHP 8.4+ you can target any supported Symfony version.
No Gedmo, StofDoctrineExtensionsBundle, or other external ORM extensions are required. The bundle manages its own tree ordering in PHP.
Next steps
Installation
Add the bundle to your Symfony project, register routes, and create the database schema.
Quickstart
Go from a fresh install to a working rendered menu in minutes.