Installation
composer require anismechri/oxy-menu-bundle
Register the bundle in config/bundles.php:
return [
// ...
Anismechri\OxyMenuBundle\OxyMenuBundle::class => ['all' => true],
];
Basic Configuration
Define a menu in config/packages/oxy_menu.yaml:
oxy_menu:
menus:
main:
items:
- label: 'Home'
route: 'homepage'
- label: 'About'
route: 'about'
First Use Case Render the menu in a Twig template:
{{ render(oxy_menu('main')) }}
YAML Configuration: Define menus in config/packages/oxy_menu.yaml for static menus.
oxy_menu:
menus:
admin:
items:
- label: 'Dashboard'
route: 'admin_dashboard'
children:
- label: 'Users'
route: 'admin_users'
Dynamic Menus via Services: Extend functionality by creating a service to fetch menu items dynamically:
// src/Service/DynamicMenuBuilder.php
class DynamicMenuBuilder
{
public function build(): array
{
return [
['label' => 'Dynamic Item', 'route' => 'dynamic_route'],
];
}
}
Register it as a compiler pass to merge with static menus.
oxy_menu Twig function to render menus:
{% set menu = oxy_menu('main') %}
<nav>{{ menu.render() }}</nav>
templates/oxy_menu/ to modify rendering logic.oxy_menu.build to modify menu items dynamically:
// src/EventListener/MenuBuilderListener.php
class MenuBuilderListener
{
public function onBuild(MenuBuildEvent $event)
{
$event->addItem('new_item', [
'label' => 'Dynamic Item',
'route' => 'dynamic_route',
]);
}
}
Register the listener in services.yaml:
services:
App\EventListener\MenuBuilderListener:
tags:
- { name: 'kernel.event_listener', event: 'oxy_menu.build', method: 'onBuild' }
generateUrl).{% for item in oxy_menu('main').items %}
{% if is_granted('ROLE_ADMIN') or item.route == 'homepage' %}
<a href="{{ path(item.route) }}">{{ item.label }}</a>
{% endif %}
{% endfor %}
main) must be unique. Overwriting a key will silently replace the existing menu.bundles.php and the config file exists at config/packages/oxy_menu.yaml.php bin/console cache:clear) if Twig templates fail to load after updates.priority option in tags to control the order of event listeners:
tags:
- { name: 'kernel.event_listener', event: 'oxy_menu.build', method: 'onBuild', priority: 10 }
// src/Twig/Extension/OxyMenuExtension.php
class OxyMenuExtension extends \Twig_Extension
{
public function getFunctions()
{
return [
new \Twig_SimpleFunction('oxy_menu_item', [$this, 'createCustomItem']),
];
}
public function createCustomItem(string $type, array $options)
{
return new CustomMenuItem($type, $options);
}
}
Use in Twig:
{{ oxy_menu_item('url', {url: '/custom-url', label: 'Custom'}) }}
oxy_menu.yaml for dynamic menus:
oxy_menu:
cache: false
composer require symfony/error-handler:^5.4 symfony/event-dispatcher:^5.4
How can I help you explore Laravel packages today?