我想创建一个管理包,以某种方式检测其他包并尝试将它们添加到菜单和相同的RBAC上下文。
例如:
你会如何实现这样的事情?在symfony 2中是否有像这样的插件式设计的原生支持?
答案 0 :(得分:5)
我不知道完整的插件解决方案,但我的方法是:
为了对话,有一个“主后端”称之为MasterAdminBundle
。此捆绑包包含base.html.twig,它仅帮助定义“管理”区域的导航栏和{% block content %}
。它还有某种显示菜单的MenuService
。我的其他捆绑包通过AdminMenu
使用Voter
子类注册此服务,就像Security Context
可以注册ProductController
一样(请参阅{{3 }})。
在base.html.twig中,我可能会使用Tag System来呈现菜单。
现在有了这种框架,您的其他捆绑包可以通过保留自己的管理路由和接口来保持封装:
ProductAdminController
现在也有@Route("/admin")
,您可以在类定义中使用路由前缀Acme\ProductBundle\Resources\views\ProductAdmin\edit_products.html.twig
。然后,任何路由都可以从包中呈现模板,因为模板保存在控制器名称下。 base.html.twig
,只要他们将MasterAdminBundle
延伸到content
并将其内容放入MasterAdminBundle
块。
对于其他事情,例如你想插入其他软件包的仪表板,我可能只是保持同样的方式,在{{1}}中创建服务并使用标签将其他类加载到其中必需的。
希望这是有道理的,也许其他人会有更好的解决方案,我也有兴趣听到,因为这也是我现在正在努力解决的问题。