У меня была структура, которая собирала данные из пакетов с помощью тегов и отображала их с помощью контроллера.
Моя структура:
Добавить компилятор Перейдите в мой файл пакета (* 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".