关于php:Symfony 4-KNP菜单-MenuBuilder没有被调用

Symfony 4 - KNP Menu - MenuBuilder not being called

我正在从Symfony 3.3升级到Symfony4。

KNPMenu在Symfony 3.3下运行良好,但是现在我看到此异常:

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

services.yaml

1
2
3
4
5
6
7
8
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
    }

我在__construct中放置了die('here');,但从未执行。

使用php bin /控制台debug:容器菜单会产生以下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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执行?


谢谢大家的时间。

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

此答案很有帮助:如何避免弃用" knp_menu.factory"?

services.yaml

1
2
3
4
5
6
7
8
9
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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可让我控制此语句提供的菜单项:

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