Registering your own renderer
=============================

Registering your own renderer in the renderer provider is simply a matter
of creating a service tagged with ``knp_menu.renderer``:

.. code-block:: yaml

    # app/config/services.yml
    services:
        app.menu_renderer:
            # The class implements Knp\Menu\Renderer\RendererInterface
            class: AppBundle\Menu\CustomRenderer
            arguments: [%kernel.charset%] # set your own dependencies here
            tags:
                # The alias is what is used to retrieve the menu
                - { name: knp_menu.renderer, alias: custom }

        # ...

If your renderer extends ``ListRenderer``, you need to provide a ``Matcher`` instance.
The configuration is then the following:

.. code-block:: yaml

    # app/config/services.yml
    services:
        app.menu_renderer:
            # The class implements Knp\Menu\Renderer\RendererInterface
            class: AppBundle\Menu\CustomRenderer
            arguments:
                - @knp_menu.matcher
                - %knp_menu.renderer.list.options%
                - %kernel.charset%
                # add your own dependencies here
            tags:
                # The alias is what is used to retrieve the menu
                - { name: knp_menu.renderer, alias: custom }

        # ...

.. note::

    The renderer service must be public as it will be retrieved at runtime to
    keep it lazy-loaded.

You can now use your renderer to render your menu:

.. code-block:: html+jinja

    {{ knp_menu_render('main', {}, 'custom') }}

.. note::

    As the renderer is responsible to render some HTML code, the ``knp_menu_render``
    function is marked as safe. Take care to handle escaping data in your renderer
    to avoid XSS if you use some user input in the menu.
