2011-11-13 27 views
1

我想创建一个管理包,它以某种方式检测其他包并尝试将它们添加到菜单和相同的RBAC上下文中。如何使用Symfony 2捆绑包设计灵活的管理面板?

例如:

  • AdminBundle限定路线/管理/仪表盘,需要认证和授权。在那里你可以看到菜单中的3个项目,例如:仪表板,配置(存储在数据库中的一些配置)和用户(用户的CRUD,在UserBundle中找到)
  • 然后有人添加了一个ProductBundle,电子商务产品什么的。不知何故,在不修改AdminBundle中的任何代码的情况下,我们现在有一个新项目“产品”,可在/ admin/dashboard中的菜单中找到。
  • 稍后,不再需要产品CRUD,因此我们只删除ProductBundle,它会自动从管理控制台菜单中消失。

你会如何去执行这样的事情?在symfony 2中有没有像这样的插件式设计的本地支持?

回答

5

我不知道一个完整的插件解决方案,但我的做法是:

有一个“主后端”称之为MasterAdminBundle谈话的缘故。该软件包包含一个base.html.twig,它只是帮助定义管理区域的导航栏和{% block content %}。它也有一些显示菜单的MenuService。如果Voter可以使用Security Context注册(请参阅here),我可以通过使用Tag System来使用AdminMenu子类别注册此服务。

在base.html.twig中,我可能会使用Embedded Controller来呈现菜单。

现在有了这种架构,以替代其他bundles可以保持通过保持自己的管理员线路和接口封装:

ProductController将现在也有ProductAdminController在那里你可以在类定义中使用的路由前缀@Route("/admin")。任何路由都可以从该包中呈现模板,因为模板在控制器名称下。 Acme\ProductBundle\Resources\views\ProductAdmin\edit_products.html.twig,只要它们从MasterAdminBundle延伸base.html.twig并将其内容放入content块。

对于其他的东西,如你想插入其他包的仪表板,我可能会继续以相同的方式,在MasterAdminBundle中创建一个服务,并使用标签将其他类加载到需要的数据中。

希望有道理,也许别人会有更好的解决方案,我也有兴趣听到,因为这是我目前正在尝试解决的问题。

+0

有趣。我没有使用标签系统,我会阅读它。谢谢 – HappyDeveloper