diabl0/config-knp-menu-bundle
Install the Bundle
composer require diabl0/config-knp-menu-bundle
Ensure KnpMenuBundle is also installed (composer require knplabs/knp-menu-bundle).
Create navigation.yaml
Place this file in config/packages/navigation.yaml (or config/navigation.yaml if using Flex):
config_knp_menu:
menu:
main: # Menu alias
tree:
- label: 'Home'
uri: '#'
children:
- label: 'About'
uri: '/about'
Register the Bundle
Add to config/bundles.php:
return [
// ...
Diabl0\ConfigKnpMenuBundle\Diabl0ConfigKnpMenuBundle::class => ['all' => true],
];
Use the Menu in a Twig Template
{{ knp_menu_render('main') }}
Define a reusable menu in navigation.yaml and render it across templates:
config_knp_menu:
menu:
admin:
tree:
- label: 'Users'
uri: '/admin/users'
- label: 'Settings'
uri: '/admin/settings'
Render in Twig:
{% if app.user.isAdmin %}
{{ knp_menu_render('admin') }}
{% endif %}
Split menus by feature/bundle (e.g., config/packages/navigation/main.yaml, config/packages/navigation/admin.yaml).
Merge them in navigation.yaml:
imports:
- { resource: 'navigation/main.yaml' }
- { resource: 'navigation/admin.yaml' }
Use Twig logic to conditionally render items:
config_knp_menu:
menu:
user:
tree:
- label: 'Profile'
uri: '/profile'
- label: 'Logout'
uri: '/logout'
display: "{{ app.user.isAuthenticated() }}"
Extend menu logic in a service:
// src/Service/CustomMenuBuilder.php
public function buildMenu(MenuItem $menu, array $options)
{
$menu->addChild('Dynamic Item', ['route' => 'dynamic_route']);
return $menu;
}
Register as a KnpMenu listener:
# config/services.yaml
services:
App\Service\CustomMenuBuilder:
tags:
- { name: knp_menu.menu_builder, method: buildMenu, alias: 'main' }
Use Symfony’s %kernel.environment% in YAML:
config_knp_menu:
menu:
dev_tools:
tree:
- label: 'Profiler'
uri: '/_profiler'
display: "{{ '%kernel.environment%' == 'dev' }}"
YAML Parsing Errors
symfony/var-dumper:
dump(file_get_contents('config/packages/navigation.yaml'));
Menu Not Rendering
KnpMenuBundle is properly registered in bundles.php.Caching Issues
php bin/console cache:clear
php bin/console debug:menu
# config/packages/knp_menu.yaml
knp_menu:
listener:
enabled: true
Custom Menu Builders
Override the default builder by implementing Knp\Menu\FactoryInterface and tagging it:
services:
App\Menu\CustomBuilder:
tags:
- { name: knp_menu.factory, method: createMenu, alias: 'custom' }
Twig Extensions Add custom filters to YAML:
{{ knp_menu_render('main', { 'activeClass': 'active' }) }}
Extend Twig in config/packages/twig.yaml:
twig:
globals:
knp_menu_options: { activeClass: 'active' }
Database-Driven Menus Fetch menu items from a DB and merge with YAML:
// src/EventListener/MenuListener.php
public function onMenuPreBuild(MenuEvent $event)
{
$menu = $event->getMenu();
$dbItems = $this->menuRepository->findAll();
foreach ($dbItems as $item) {
$menu->addChild($item->getLabel(), ['route' => $item->getRoute()]);
}
}
Register as a KnpMenu listener:
services:
App\EventListener\MenuListener:
tags:
- { name: knp_menu.listener, method: onMenuPreBuild, alias: 'main' }
imports to manage precedence.KnpMenuBundle defaults. Override selectively:
config_knp_menu:
menu:
main:
default_options:
delay: 100
safe_labels: true
How can I help you explore Laravel packages today?