Symfony KnpMenuBundle показывает ошибку [MenuBuilder как услуга]

Я использую sumfony 3.3.10, я установил новый проект symfony и добавил knpMenuBundle с помощью этой команды,

composer require knplabs/knp-menu-bundle "^2.0"

Теперь я сделал все точно так, как указано здесь http://symfony.com/doc/master/bundles/KnpMenuBundle/menu_builder_service.html

и добавил эту строку {{ knp_menu_render('main') }} в файл default/index.html.twig.

Теперь, когда я запускаю проект, он показывает мне эту ошибку,

[InvalidArgumentException]


Menu builder services must be public but "app.menu_builder" is a private service.

config.yml

knp_menu:
        # use "twig: false" to disable the Twig extension and the TwigRenderer
        twig:
            template: KnpMenuBundle::menu.html.twig
        #  if true, enables the helper   for PHP templates
        templating: false
        # the renderer to use, list is also available by default
        default_renderer: twig

MenuBuilder.php

    <?php
namespace AppBundle\Menu;

use Knp\Menu\FactoryInterface;

    class MenuBuilder
{
    private $factory;

    /**
     * @param FactoryInterface $factory
     *
     * Add any other dependency you need
     */
    public function __construct(FactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public function createMainMenu(array $options)
     {
        $menu = $this->factory->createItem('root');

        $menu->addChild('Home', array('route' => 'homepage'));
        // ... add more children

        return $menu;
     }
 }

services.yml

app.menu_builder:
            class: AppBundle\Menu\MenuBuilder
            arguments: ["@knp_menu.factory"]
            tags:
                - { name: knp_menu.menu_builder, method: createMainMenu, alias: main } # The alias is what is used to retrieve the menu

Как я могу это решить. Буду признателен за любую оказанную помощь. Спасибо


person Aamir    schedule 11.10.2017    source источник


Ответы (1)


Я добавил public: true в сервис app.menu_builder в services.php,

app.menu_builder:
        class: AppBundle\Menu\MenuBuilder
        public: true
        arguments: ["@knp_menu.factory"]
        tags:
            - { name: knp_menu.menu_builder, method: createMainMenu, alias: main } # The alias is what is used to retrieve the menu

И теперь все работает нормально.

См.: https://symfony.com/doc/current/service_container/alias_private.html#marking-services-as-public-private

person Aamir    schedule 11.10.2017