代码之家  ›  专栏  ›  技术社区  ›  user2182349

Symfony 4-KNP菜单-未调用MenuBuilder

  •  0
  • user2182349  · 技术社区  · 8 年前

    我正在从Symfony 3.3升级到Symfony 4。

    KNPMenu在Symfony 3.3下运行良好,但现在我看到了这个例外:

    在呈现模板期间引发了异常(“ 菜单“main”未定义。“”。

    服务。亚马尔

    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 }
    

    菜单生成器

    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'); __构造 ,它从未执行。

    使用 php bin/控制台调试:容器菜单 收益率:

    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 \uu构造执行?

    1 回复  |  直到 8 年前
        1
  •  1
  •   user2182349    8 年前

    谢谢大家抽出时间。

    这一要点很有帮助: https://gist.github.com/lsv/4d8044d21819f28f0dde52a3fb8211a0

    这个答案很有帮助: How to avoid "knp_menu.factory" deprecation?

    服务。亚马尔

    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 获取安全授权检查程序

    然后我更新了 菜单生成器。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' ) )
    
    推荐文章