Symfony 4 - KNP Menu - MenuBuilder не вызывается

Я перехожу с Symfony 3.3 на Symfony 4.

KNPMenu нормально работал под Symfony 3.3, но теперь я вижу это исключение:

An exception has been thrown during the rendering of a template ("The menu "main" is not defined.").

services.yaml

App\Menu\MenuBuilder:
    public: true
    tags:
        - { name: app.menu_builder.admin, method: createAdminMenu, alias: admin }
        - { name: app.menu_builder.calendar, method: createCalendarMenu, alias: calendar }
        - { name: app.menu_builder.main, method: createMainMenu, alias: main }
        - { name: app.menu_builder.trailer, method: createTrailerMenu, alias: trailer }
        - { name: app.menu_builder.user, method: createUserMenu, alias: user }

MenuBuilder

Namespace App\Menu;

use Knp\Menu\FactoryInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use Symfony\Component\Security\Core\Security;

class MenuBuilder implements ContainerAwareInterface
{

    use ContainerAwareTrait;

    private $factory;

    /**
     * @param FactoryInterface $factory
     */
    public function __construct( FactoryInterface $factory )
    {
        $this->factory = $factory;
    }

Я помещаю die('here'); в __construct, он никогда не запускается.

Использование php bin / console debug: меню контейнера дает:

Information for Service "App\Menu\MenuBuilder"
==============================================

 ---------------- ------------------------------------------------------------------------- 
  Option           Value                                                                    
 ---------------- ------------------------------------------------------------------------- 
  Service ID       App\Menu\MenuBuilder                                                     
  Class            App\Menu\MenuBuilder                                                     
  Tags             app.menu_builder.admin (method: createAdminMenu, alias: admin)           
                   app.menu_builder.calendar (method: createCalendarMenu, alias: calendar)  
                   app.menu_builder.main (method: createMainMenu, alias: main)              
                   app.menu_builder.trailer (method: createTrailerMenu, alias: trailer)     
                   app.menu_builder.user (method: createUserMenu, alias: user)              
  Public           yes                                                                      
  Synthetic        no                                                                       
  Lazy             no                                                                       
  Shared           yes                                                                      
  Abstract         no                                                                       
  Autowired        yes                                                                      
  Autoconfigured   yes                                                                      
 ---------------- ------------------------------------------------------------------------- 

Как я могу запустить MenuBuilder __construct?

Я думаю, вам следовало сначала обновиться до Symfony 3.4, чтобы получать все уведомления об устаревании.

Philippe-B- 17.04.2018 07:43
Вы это читали?
Philippe-B- 17.04.2018 07:50

Какую версию меню KNP вы используете?

Philippe-B- 17.04.2018 08:09

Попробуйте установить для autowired и / или autoconfigured значение false. Взгляните на symfony.com/doc/current/bundles/KnpMenuBundle/menu_service.h‌ tml, чтобы правильно зарегистрировать службу меню.

Weenesta - Mathieu Dormeval 17.04.2018 09:31

Я прочитал и следил за документацией, использую Symfony Flex. При отключенных autowire и autoconfigure тоже не работало. Я рассмотрел все зависимости, и есть только одно уведомление об устаревании. Страница по умолчанию загружается с активами, управляемыми через webpack / encore.

user2182349 17.04.2018 11:14

@MathieuDormeval - я регистрирую MenuBuilder как сервис

user2182349 17.04.2018 11:16

Если вы устанавливаете autowired на false, это должно быть исключение, потому что вы не устанавливаете заводские параметры службы, например: arguments: ["@knp_menu.factory"]

Weenesta - Mathieu Dormeval 17.04.2018 11:32

Аргумент был, когда autowire был ложным

user2182349 17.04.2018 11:34

Остальные меню работают?

Weenesta - Mathieu Dormeval 17.04.2018 11:39

Ни одно из меню не работает

user2182349 17.04.2018 11:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
10
937
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо всем за ваше время.

Эта суть была полезной: https://gist.github.com/lsv/4d8044d21819f28f0dde52a3fb8211a0

Этот ответ был полезен: Как избежать устаревания "knp_menu.factory"?

services.yaml

app.menu_builder:
    class: App\Menu\MenuBuilder

app.menu.main:
    class: Knp\Menu\MenuItem
    factory: ['@app.menu_builder', 'createMainMenu']
    arguments: { $options: [] }
    tags:
    - { name: knp_menu.menu, alias: main }

Я использовал php bin/console debug:autowiring security для проверки авторизации безопасности

Затем я обновил MenuBuilder.php вот так:

Namespace App\Menu;

use Knp\Menu\FactoryInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

class MenuBuilder
{

    private $factory;
    private $security;

    /**
     * @param FactoryInterface $factory
     */
    public function __construct( FactoryInterface $factory, AuthorizationCheckerInterface $security )
    {
        $this->factory = $factory;
        $this->security = $security;
    }

Добавление SecurityAuthorizationChecker позволяет мне контролировать пункты меню, предлагаемые с помощью этого оператора:

if ( $this->security->isGranted( 'IS_AUTHENTICATED_FULLY' ) )

Другие вопросы по теме