doukuibi9631 2018-04-17 03:48
浏览 43
已采纳

Symfony 4 - KNP菜单 - 未调用MenuBuilder

I am upgrading from Symfony 3.3 to Symfony 4.

KNPMenu was running fine under Symfony 3.3, but now I am seeing this exception:

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;
    }

I put a die('here'); in the __construct, it is never executed.

Using php bin/console debug:container menu yields:

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                                                                      
 ---------------- ------------------------------------------------------------------------- 

How can I get MenuBuilder __construct to execute?

  • 写回答

1条回答 默认 最新

  • duanniu3385 2018-04-17 22:59
    关注

    Thank you all for your time.

    This gist was helpful: https://gist.github.com/lsv/4d8044d21819f28f0dde52a3fb8211a0

    This answer was helpful: How to avoid "knp_menu.factory" deprecation?

    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 }
    

    I used php bin/console debug:autowiring security to get the security authorization checker

    Then I updated MenuBuilder.php like so:

    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;
        }
    

    Adding the SecurityAuthorizationChecker allows me to control the menu items offered with this statement:

    if( $this->security->isGranted( 'IS_AUTHENTICATED_FULLY' ) )
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛