【问题标题】:How to design a flexible admin panel with Symfony 2 bundles?如何使用 Symfony 2 包设计一个灵活的管理面板?
【发布时间】:2011-11-13 01:57:58
【问题描述】:
我想创建一个管理包,它以某种方式检测其他包并尝试将它们添加到菜单和相同的 RBAC 上下文中。
例如:
- AdminBundle 定义了一个路由 /admin/dashboard,它需要身份验证和授权。在那里您可以在菜单中看到 3 个项目,例如:仪表板、配置(存储在 db 中的一些配置)和用户(用户的 CRUD,在 UserBundle 中找到)
- 然后有人添加了一个 ProductBundle,它处理电子商务产品或其他东西的 CRUD。不知何故,在不修改 AdminBundle 中的任何代码的情况下,我们现在有了一个新项目“产品”,在 /admin/dashboard 的菜单中可用
- 稍后,产品 CRUD 不再需要,因此我们只需删除 ProductBundle,它就会自动从管理仪表板菜单中消失。
您将如何实施这样的事情?在 symfony 2 中是否有对类似插件设计的原生支持?
【问题讨论】:
标签:
plugins
symfony
admin
【解决方案1】:
我不知道完整的插件解决方案,但我的方法是:
为了便于交流,有一个“主后端”将其称为MasterAdminBundle。这个包包含一个base.html.twig,它只是帮助定义管理区域的导航栏和一个{% block content %}。它还有某种MenuService 来显示菜单。我会让我的其他捆绑包通过使用Tag System 向此服务注册AdminMenu 子类,就像Voter 可以向Security Context 注册一样(请参阅here)。
在 base.html.twig 中,我可能会使用 Embedded Controller 来呈现菜单。
现在有了这种框架,您的其他包可以通过保留自己的管理路由和接口来保持封装:
ProductController 现在还有ProductAdminController,您可以在类定义中使用路由前缀@Route("/admin")。然后任何路由都可以从包中渲染模板,因为模板保存在控制器名称下。 Acme\ProductBundle\Resources\views\ProductAdmin\edit_products.html.twig 只要他们从 MasterAdminBundle 扩展 base.html.twig 并将其内容放入 content 块中。
对于诸如仪表板之类的其他东西,您希望将其他捆绑包插入其中,我可能会继续以相同的方式,在MasterAdminBundle 中创建一个服务,并使用标签将其他类与所需的数据一起加载到其中。
希望这是有道理的,也许其他人会有更好的解决方案,我也很想听听,因为这也是我目前正在尝试解决的问题。