Único item de KnpMenuBundle

Unos de los bundles indispensables para practicamente el 100% de mis desarrollos con Symfony2 es KnpMenuBundle.

Cuando lo estamos utilizando, por multitud de motivos, es posible que necesitemos mostrar un único item de toda la estructura de nuestro menú.

Conseguirlo es una tarea bastante sencilla, y es el motivo de este post, voy a explicarlo ahora mismo.

Para poder mostrar el código en nuestro Twig, lo primero de todo es tener creado nuestro menú con KnpMenuBundle:

<?php

namespace AppBundle\Menu;

use Knp\Menu\FactoryInterface;

/**
 * Description of MenuBuilder
 *
 * @author Juanjo García
 */
class MenuBuilder {

    private $factory;

    /**
     * @param FactoryInterface $factory
     */
    public function __construct(FactoryInterface $factory) {
        $this-&gt;factory = $factory;
    }

    /**
     * menú Principal del sitio web
     * 
     * @param array $options
     * @return type
     */
    public function createMainMenu(array $options) {


        $menu = $this-&gt;factory-&gt;createItem('root');


        // index
        $menu-&gt;addChild('root_index', [
            'route' =&gt; 'homepage',
            'label' =&gt; 'Inicio'
                ]
        )
        ;

        // Sección 01
        $menu-&gt;addChild('root_seccion_uno', [
            'route' =&gt; 'seccion_uno',
            'label' =&gt; 'Sección Uno'
                ]
        )
        ;

        // Sección 02
        $menu-&gt;addChild('root_seccion_dos', [
            'route' =&gt; 'seccion_dos',
            'label' =&gt; 'Sección Dos'
                ]
        )
        ;

        return $menu;
    }

}

Como se puede ver, he creado un menú de ejemplo, con 3 items.

En este ejemplo, voy a cargar el menú como un servicio, por lo que tenemos que definirlo en nuestro archivo services.yml:

services:      
    app.menu_builder.principal:
        class: AppBundle\Menu\MenuBuilder
        arguments: ["@knp_menu.factory"]
        tags:
            - { name: knp_menu.menu_builder, method: createMainMenu, alias: menuPrincipal }

Con el menú preparado y listo para usarlo en nuestras plantillas Twig, vamos a mostrar como mostrar un único item:

{% extends "::base.html.twig" %}

{% block mainbody %}
    {# arreglo para mostrar un único item del menú principal #}
    {% set menuItem = knp_menu_get('menuPrincipal', ['root_seccion_uno']) %}
    &lt;a href="{{ menuItem.uri }}"&gt;
        {{ menuItem.label}}
    &lt;/a&gt;   
{% endblock %}

El twig de ejemplo, extiende el twig base, que no voy a poner ya que resulta irrelevante para lo que nos ocupa.

En la línea 5, es donde obtenemos este item y toda su información, guardándolo en variable, que utilizamos en las líneas 6 y 7, recuperando su Route y su Label respectivamente.

¡Listo! ya tenemos un único item de KnpMenuBundle pintado en nuestra página.