使用事件允许扩展菜单
编辑本页使用事件允许扩展菜单
如果您想让系统的不同部分与菜单的构建挂钩,一个好方法是使用基于Symfony EventDispatcher组件的方法。ob娱乐下载
创建菜单构建器
您的菜单构建器将创建基本菜单项,然后分派一个事件以允许应用程序的其他部分向其添加更多内容。
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/ / src /菜单/ MainBuilder.php名称空间应用程序\菜单;使用应用程序\事件\ConfigureMenuEvent;使用Knp\菜单\FactoryInterface;使用ob娱乐下载\组件\DependencyInjection\ContainerAwareInterface;使用ob娱乐下载\组件\DependencyInjection\ContainerAwareTrait;类MainBuilder实现了ContainerAwareInterface{使用ContainerAwareTrait;公共函数构建(FactoryInterface$工厂){$菜单=$工厂->createItem (“根”);$菜单->addChild (“仪表板”, (“路线”=>“_acp_dashboard”]);$这->容器->get (“event_dispatch”)->调度(新ConfigureMenuEvent ($工厂,$菜单), ConfigureMenuEvent::配置);返回$菜单;}}
请注意
这个实现假设您使用BuilderAliasProvider
(把你的菜单应用:MainBuilder:构建
),但也可以将其定义为服务并注入event_dispatch
作为依赖项的服务。
创建Event对象
事件对象允许将一些数据传递给侦听器。在本例中,它将保存正在创建的菜单和工厂。
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/ / src /事件/ ConfigureMenuEvent.php名称空间应用程序\事件;使用Knp\菜单\FactoryInterface;使用Knp\菜单\ItemInterface;使用ob娱乐下载\组件\EventDispatcher\事件;类ConfigureMenuEvent扩展事件{常量配置=“app.menu_configure”;私人$工厂;私人$菜单;公共函数__construct(FactoryInterface$工厂, ItemInterface$菜单){$这->工厂=$工厂;$这->菜单=$菜单;}/ * * *@return菜单\ Knp \ \ FactoryInterface * /公共函数getFactory(){返回$这->工厂;}/ * * *@return菜单\ Knp \ \ ItemInterface * /公共函数getMenu(){返回$这->菜单;}}
就是这样。您的构建器现在提供了一个钩子。让我们看看如何使用它!
创建监听器
您可以为该事件注册任意数量的侦听器。再加一个。
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / Acme / AdminBundle / EventListener / ConfigureMenuListener.php名称空间Acme\AdminBundle\EventListener;使用应用程序\事件\ConfigureMenuEvent;类ConfigureMenuListener{公共函数__invoke(ConfigureMenuEvent$事件){$菜单=$事件->getMenu ();$菜单->addChild (“匹配”, (“路线”=>“versus_rankedmatch_acp_matches_index”]);$菜单->addChild (“参与者”, (“路线”=>“versus_rankedmatch_acp_participants_index”]);}}
现在可以注册侦听器了。
1 2 3 4 5
#配置/ services.yaml服务:app.admin_configure_menu_listener:类:Acme \ AdminBundle \ EventListener \ ConfigureMenuListener标签:(kernel.event_listener)
方法还可以将侦听器创建为订阅者并使用kernel.event_subscriber
标记,该标记没有任何附加属性。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。