Symfony 5 CompilerPassInterface - сбор данных и отображение с использованием контроллера - PullRequest
0 голосов
/ 17 марта 2020

У меня была структура, которая собирала данные из пакетов с помощью тегов и отображала их с помощью контроллера.

Моя структура:

Добавить компилятор Перейдите в мой файл пакета (* Bundle. php )

 class SystemBundle extends Bundle
    {
        public function build(ContainerBuilder $container)
        {
            parent::build($container);
            $container->addCompilerPass(new MenuCompilerPass());        
        }
    }

, затем MenuCompilerPass

class MenuCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container) 
    {

        if(!$container->hasDefinition('menumanager'))
        {
            throw new \Exception("Sory but the menu manager doesn't exist");
        }            

        $definition = $container->getDefinition('menumanager');
        $tagged = $container->findTaggedServiceIds('menu.element');

        foreach($tagged as $key => $val)
        {
            $definition->addMethodCall('addMenu', [new Reference($key)]);
        }
    }
}

файл service.yaml

menumanager:
    class: System\Manager\MenuManager
    public: true

system.admin:
    class: System\Admin\Admin
    public: true
    tags:
        - {name: menu.element}

, файл менеджера меню

class MenuManager
{        
    private $menus = [];

    public function addMenu(MenuInterface $menu)
    {
        $this->menus[] = $menu;
    }

    public function getMenu()
    {
        return $this->menus;
    }
}

и Admin ( где настроено меню)

class Admin implements MenuInterface
{
    public function getMenu(){
        $menu = array(
            array(
                'name' => 'Menu',
                'path' => '#',
                'icon' => 'fa-user',
                'position' => 1,
                'children' =>
                    array(
                        array(
                            'name' => 'Submenu',
                            'path' => '#'
                        )
                    )
            ),            
            array(
                'name' => 'ONE',
                'path' => '#',
                'icon' => 'fa-user',
                'position' => 2
            )            
        );
        return $menu;
    }
}

Теперь в контроллере я бы хотел получить свое меню. Я проверил это двумя способами. Первый

<code>public function navigation(Request $originalRequest)
{          
    $menu = $this->container->get('menumanager');

    echo "<pre>";
    var_dump($menu->getMenu());
    echo "
"; вернуть новый Ответ ('test');}

Здесь у меня ошибка, что не найден диспетчер сервисного меню.

Второй метод, в котором я попробуйте использовать MenuManager в качестве параметра метода:

<code>public function navigation(Request $originalRequest, MenuManager $menu)
{          
    echo "<pre>";
    var_dump($menu->getMenu());
    echo "
"; вернуть новый ответ («тест»); }

Работает, но ничего не показывает. Кто-то может объяснить, почему он не работает в SF5?

Наконец, я хотел бы добавить, что при попытке добавить исключение в метод addMenu в MenuManager оно не отображалось. Вот почему я думаю, что этот метод не вызывает. В то время как переменная «tagged» имеет элемент, вызывается addMethodCall.

Привет еще раз: это сообщение можно удалить. Решением для моей проблемы было "! Tagged_iterator".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...