Sylius/Symfony 3 внедряет сервис в сервис

Я создал сервис для расширения меню в админке Sylius. Работает хорошо ;) Я следую официальному документу

Я пытаюсь внедрить службу маршрутизатора, но у меня следующая ошибка:

Ошибка типа: слишком мало аргументов для функции XXMenuListener::__construct(), 0 передано в appDevDebugProjectContainer.php в строке 1542 и ровно 1 ожидается

Объявление этой службы:

services:
    app.listener.admin.menu_builder:
        class: XXX\Menu\AdminMenuListener
        autowire: true
        arguments:
            - '@router'
        tags:
            - { name: kernel.event_listener, event: sylius.menu.admin.main, method: addAdminMenuItems }

и сам сервис:

<?php

namespace XXX\Menu;

use Sylius\Bundle\UiBundle\Menu\Event\MenuBuilderEvent;
use Symfony\Bundle\FrameworkBundle\Routing\Router;

final class AdminMenuListener
{

    private $router;

    public function __construct(Router $router){
        $this->router = $router;
    }


    /**
     * @param MenuBuilderEvent $event

     */
    public function addAdminMenuItems(MenuBuilderEvent $event){
        $menu = $event->getMenu();

        $newSubmenu = $menu
            ->addChild('new')
            ->setLabel('XXX')
        ;

        $newSubmenu
            ->addChild('new-subitem')
            ->setLabel('XXX')
            //->setUri('https://www.google.com');
            ->setUri($this->router->generate('foo'))
        ;
    }
}

Что не так в? Спасибо за вашу помощь!


person darkiron    schedule 05.10.2017    source источник
comment
В вашем сообщении об ошибке у вас есть «XXMenuListener», который не соответствует имени вашего класса слушателя? Я подозреваю, что вы отредактировали его в своем вопросе? Но в любом случае начните с удаления каталога кеша, чтобы устранить его как возможную проблему.   -  person Cerad    schedule 05.10.2017


Ответы (2)


Я думаю, вам нужно очистить кеш, если не помогло, почистите каталог кеша вручную. В любом случае вам не нужна служба маршрутизатора, потому что она уже есть в конструкторе меню.

Например:

для ури

$newSubmenu
   ->addChild('new-subitem')
   ->setLabel('XXX')
   ->setUri('https://www.google.com')
;

для маршрута

$newSubmenu
   ->addChild('new-subitem', ['route' => 'foo'])
   ->setLabel('XXX')
;
person Andrey V.    schedule 06.10.2017
comment
Спасибо, это решение ;) - person darkiron; 06.10.2017

Если вы используете от autowire до true, вам не нужно указывать службу маршрутизатора. Что-то вроде этого должно быть достаточно:

services:
    app.listener.admin.menu_builder:
        class: XXX\Menu\AdminMenuListener
        autowire: true
        tags:
            - { name: kernel.event_listener, event: sylius.menu.admin.main, method: addAdminMenuItems }

В любом случае ваша ошибка указывает на то, что у вас нет аргументов. Возможно, это проблема с кешированием, или у вас есть другое объявление службы для того же класса XXX\Menu\AdminMenuListener без автопривязки к истине и без аргументов.

person Fabien Salles    schedule 05.10.2017
comment
autowire не имеет никакого эффекта. Аргументы тоже... Мой стек опрятен и чист. Иметь только одну услугу. - person darkiron; 05.10.2017