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

Config Knp Menu Bundle Laravel Package

diabl0/config-knp-menu-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Install the Bundle

    composer require diabl0/config-knp-menu-bundle
    

    Ensure KnpMenuBundle is also installed (composer require knplabs/knp-menu-bundle).

  2. 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'
    
  3. Register the Bundle Add to config/bundles.php:

    return [
        // ...
        Diabl0\ConfigKnpMenuBundle\Diabl0ConfigKnpMenuBundle::class => ['all' => true],
    ];
    
  4. Use the Menu in a Twig Template

    {{ knp_menu_render('main') }}
    

First Use Case: Dynamic Navigation

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 %}

Implementation Patterns

1. Modular Menu Definitions

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' }

2. Dynamic Menu Items

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() }}"

3. Integration with KnpMenuBuilder

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' }

4. Environment-Specific Menus

Use Symfony’s %kernel.environment% in YAML:

config_knp_menu:
    menu:
        dev_tools:
            tree:
                - label: 'Profiler'
                  uri: '/_profiler'
                  display: "{{ '%kernel.environment%' == 'dev' }}"

Gotchas and Tips

Pitfalls

  1. YAML Parsing Errors

    • Ensure proper indentation (2 spaces per level).
    • Validate YAML with symfony/var-dumper:
      dump(file_get_contents('config/packages/navigation.yaml'));
      
  2. Menu Not Rendering

    • Verify the menu alias matches exactly (case-sensitive).
    • Check if KnpMenuBundle is properly registered in bundles.php.
  3. Caching Issues

    • Clear cache after YAML changes:
      php bin/console cache:clear
      

Debugging Tips

  • Dump Menu Structure Use KnpMenu’s debug command:
    php bin/console debug:menu
    
  • Log Menu Events Enable KnpMenu’s event listener for debugging:
    # config/packages/knp_menu.yaml
    knp_menu:
        listener:
            enabled: true
    

Extension Points

  1. 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' }
    
  2. 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' }
    
  3. 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' }
    

Config Quirks

  • Priority of Configs Later YAML files override earlier ones. Use imports to manage precedence.
  • Default Values The bundle merges configs with KnpMenuBundle defaults. Override selectively:
    config_knp_menu:
        menu:
            main:
                default_options:
                    delay: 100
                    safe_labels: true
    
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.
cuci/prototurk-sdk-symfony
clementtalleu/easyadmin-markdown-bundle
codeflextech/permission-manager
karnoweb/livewire-datepicker
sayedenam/sayed-dashboard
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager