dahovitech/menu-bundle
Bundle Symfony pour créer, configurer et afficher des menus via YAML : items hiérarchiques, templates Twig par menu, attributs HTML dynamiques, paramètres de route, gestion de l’état actif, ARIA, visibilité via voters, events et cache intégré.
Installation:
composer require dahovitech/menu-bundle:dev-main
Enable in config/bundles.php:
Dahovitech\MenuBundle\DahovitechMenuBundle::class => ["all" => true],
Basic Configuration:
Create config/packages/dahovitech_menu.yaml:
dahovitech_menu:
menus:
main_menu:
items:
- label: 'Home'
route: 'app_home'
First Use Case: Render in Twig:
{{ dahovitech_menu('main_menu') }}
children:
items:
- label: 'Services'
children:
- label: 'Web Design'
route: 'app_web_design'
items:
- label: 'Contact'
route: 'app_contact'
attributes:
class: 'btn btn-primary'
data-toggle: 'modal'
Pass parameters to routes:
items:
- label: 'User Profile'
route: 'app_user_profile'
route_params:
id: 42
Override default templates per menu:
menus:
admin_menu:
template: '@App/menu/admin.html.twig'
Modify menus dynamically via MenuBuildEvent:
// src/EventSubscriber/CustomMenuSubscriber.php
public function onMenuBuild(MenuBuildEvent $event) {
if ($event->getMenuName() === 'main_menu') {
$event->addItem(new MenuItem('Dynamic Item', '/dynamic'));
}
}
Restrict menu items by role:
items:
- label: 'Admin Panel'
route: 'app_admin'
voter: 'admin_voter' // Custom voter service ID
Caching Quirks:
php bin/console cache:clear
cache:pool-clear dahovitech_menu.cache for targeted clearing.Route Parameter Conflicts:
route_params keys match the route definition exactly (case-sensitive).Voter Priority:
priority tags to control evaluation sequence.{{ dump(dahovitech_menu('main_menu').getItems()) }}
framework:
profiler:
enabled: true
Custom Menu Builders:
Implement Dahovitech\MenuBundle\Builder\MenuBuilderInterface for alternative menu logic.
Template Inheritance:
Extend base templates (@DahovitechMenu/menu.html.twig) in your theme.
ARIA Attributes:
Add custom ARIA roles via attributes:
attributes:
aria-expanded: 'true'
config/packages/dahovitech_menu.yaml:
dahovitech_menu:
cache:
enabled: true
ttl: 3600 # 1 hour
How can I help you explore Laravel packages today?