allekslar/monofony-menu-extension
Installation
composer require allekslar/monofony-menu-extension
Ensure your project uses Sylius 1.12+ and Monofony/Skeleton (or a compatible admin theme).
Enable the Bundle
Add to config/bundles.php:
return [
// ...
Allekslar\MonofonyMenuExtension\MonofonyMenuExtension::class => ['all' => true],
];
First Use Case
Subscribe to the 'sylius.menu.admin.main' event to modify the admin menu dynamically:
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Sylius\Bundle\UiBundle\Event\MenuBuilderEvent;
class CustomMenuSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
'sylius.menu.admin.main' => 'addCustomMenuItem',
];
}
public function addCustomMenuItem(MenuBuilderEvent $event): void
{
$menu = $event->getMenu();
$menu->addChild('custom_section', [
'label' => 'Custom Section',
'icon' => 'fas fa-rocket',
]);
}
}
Register the subscriber in config/services.yaml:
services:
App\EventSubscriber\CustomMenuSubscriber:
tags: ['kernel.event_subscriber']
Menu Extension
Use the 'sylius.menu.admin.main' event to inject, modify, or remove menu items in the Monofony/Skeleton admin panel. Example:
$menu->addChild('products', ['label' => 'Products', 'route' => 'sylius_admin_product_index']);
Dynamic Menu Logic Leverage the event object to conditionally build menus:
if ($event->getRequest()->get('_route') === 'sylius_admin_dashboard') {
$menu->addChild('welcome', ['label' => 'Welcome', 'route' => 'sylius_admin_dashboard']);
}
Nested Menus Create hierarchical menus with sub-items:
$parent = $menu->addChild('reports', ['label' => 'Reports']);
$parent->addChild('sales', ['label' => 'Sales Report', 'route' => 'sylius_admin_report_sales']);
Icon Integration Use Font Awesome icons (default in Monofony) for visual clarity:
$menu->addChild('settings', [
'label' => 'Settings',
'icon' => 'fas fa-cog',
'route' => 'sylius_admin_settings_index',
]);
Route-Based Menus Tie menu items to Sylius routes for consistency:
$menu->addChild('orders', ['label' => 'Orders', 'route' => 'sylius_admin_order_index']);
priority in getSubscribedEvents() to control execution order:
return [
'sylius.menu.admin.main' => ['addCustomMenuItem', priority: 10], // Higher priority = earlier execution
];
$menu->addChild('custom', ['label' => 'app.ui.custom_section']);
Define translations in translations/messages.en.yaml:
app:
ui:
custom_section: 'Custom Section'
Missing Bundle Enable
Forgetting to enable the bundle in bundles.php will silently fail. Verify with:
php bin/console debug:container allekslar_monofony_menu_extension
Event Name Mismatch
The event name is case-sensitive: 'sylius.menu.admin.main' (not sylius_menu_admin_main). Double-check spelling.
Monofony Dependency The package requires Monofony/Skeleton. If using a different admin theme (e.g., Sylius Standard), this won’t work. Verify with:
composer show monofony/skeleton
Caching Issues After modifying menus, clear the cache:
php bin/console cache:clear
Route Conflicts If a menu item’s route doesn’t exist, it will render as a dead link. Validate routes with:
php bin/console debug:router
Dump Menu Structure Inspect the menu object in your subscriber:
public function addCustomMenuItem(MenuBuilderEvent $event): void
{
dump($event->getMenu()->getChildren());
}
Check Event Dispatch
Verify the event is fired by adding a subscriber with a dump():
public function __invoke(MenuBuilderEvent $event): void
{
dump('Event fired!', $event->getRequest()->get('_route'));
}
Symfony Profiler Use the EventDispatcher panel in Symfony Profiler to debug event subscribers and their order.
Custom Menu Providers Create a service to generate menus dynamically:
class CustomMenuProvider
{
public function buildMenu(Menu $menu, Request $request): void
{
// Logic to build menu based on user roles, etc.
}
}
Subscribe it to the event:
return [
'sylius.menu.admin.main' => ['buildMenu', 20], // Lower priority = later execution
];
Role-Based Menus Use Sylius’ security system to show/hide items:
if ($this->security->isGranted('ROLE_ADMIN')) {
$menu->addChild('admin_only', ['label' => 'Admin Only']);
}
Dynamic Icons Fetch icons from a database or API:
$icon = $this->iconService->getForRoute($route);
$menu->addChild('dynamic', ['label' => 'Dynamic', 'icon' => $icon]);
Localization Override translations per locale by extending Sylius’ translation system:
# translations/messages.fr.yaml
app:
ui:
custom_section: 'Section Personnalisée'
How can I help you explore Laravel packages today?