Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Monofony Menu Extension Laravel Package

allekslar/monofony-menu-extension

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require allekslar/monofony-menu-extension
    

    Ensure your project uses Sylius 1.12+ and Monofony/Skeleton (or a compatible admin theme).

  2. Enable the Bundle Add to config/bundles.php:

    return [
        // ...
        Allekslar\MonofonyMenuExtension\MonofonyMenuExtension::class => ['all' => true],
    ];
    
  3. 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']
    

Implementation Patterns

Core Workflow

  1. 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']);
    
  2. 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']);
    }
    
  3. 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']);
    
  4. 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',
    ]);
    
  5. Route-Based Menus Tie menu items to Sylius routes for consistency:

    $menu->addChild('orders', ['label' => 'Orders', 'route' => 'sylius_admin_order_index']);
    

Integration Tips

  • Sylius Compatibility: Works seamlessly with Sylius 1.12+ and Monofony/Skeleton. Test with your Sylius version.
  • Event Order: Subscribers are processed in registration order. Use priority in getSubscribedEvents() to control execution order:
    return [
        'sylius.menu.admin.main' => ['addCustomMenuItem', priority: 10], // Higher priority = earlier execution
    ];
    
  • Translation Support: Use Sylius translation keys for labels:
    $menu->addChild('custom', ['label' => 'app.ui.custom_section']);
    
    Define translations in translations/messages.en.yaml:
    app:
        ui:
            custom_section: 'Custom Section'
    

Gotchas and Tips

Common Pitfalls

  1. 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
    
  2. Event Name Mismatch The event name is case-sensitive: 'sylius.menu.admin.main' (not sylius_menu_admin_main). Double-check spelling.

  3. 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
    
  4. Caching Issues After modifying menus, clear the cache:

    php bin/console cache:clear
    
  5. 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
    

Debugging Tips

  1. Dump Menu Structure Inspect the menu object in your subscriber:

    public function addCustomMenuItem(MenuBuilderEvent $event): void
    {
        dump($event->getMenu()->getChildren());
    }
    
  2. 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'));
    }
    
  3. Symfony Profiler Use the EventDispatcher panel in Symfony Profiler to debug event subscribers and their order.


Extension Points

  1. 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
    ];
    
  2. Role-Based Menus Use Sylius’ security system to show/hide items:

    if ($this->security->isGranted('ROLE_ADMIN')) {
        $menu->addChild('admin_only', ['label' => 'Admin Only']);
    }
    
  3. Dynamic Icons Fetch icons from a database or API:

    $icon = $this->iconService->getForRoute($route);
    $menu->addChild('dynamic', ['label' => 'Dynamic', 'icon' => $icon]);
    
  4. Localization Override translations per locale by extending Sylius’ translation system:

    # translations/messages.fr.yaml
    app:
        ui:
            custom_section: 'Section Personnalisée'
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
directorytree/privacy-filter-classifier
directorytree/privacy-filter
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
22h/doctrine-garbage-collection-bundle
agtp/agtp-php
agtp/mod-php
splash/sonata-admin
splash/metadata
splash/openapi
splash/scopes
splash/toolkit
testo/output-teamcity
testo/bridge-symfony
spatie/flare-daemon-runtime