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中放置了
使用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 } |
我使用
然后我像这样更新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' ) ) |