如何使用Symfony 2软件包设计灵活的管理面板?

时间:2011-11-13 01:57:58

标签: plugins symfony admin

我想创建一个管理包,以某种方式检测其他包并尝试将它们添加到菜单和相同的RBAC上下文。

例如:

  • AdminBundle定义路由/管理员/仪表板,需要身份验证和授权。在那里你可以看到菜单中的3个项目,例如:仪表板,配置(存储在数据库中的一些配置)和用户(用户的CRUD,在UserBundle中找到)
  • 然后有人添加了一个ProductBundle,它处理电子商务产品或其他东西的CRUD。不知何故,如果不修改AdminBundle中的任何代码,我们现在有一个新项目'产品',可在/ admin / dashboard中的菜单中找到
  • 稍后,不再需要产品CRUD,因此我们只删除ProductBundle,它会自动从管理仪表板菜单中消失。

你会如何实现这样的事情?在symfony 2中是否有像这样的插件式设计的原生支持?

1 个答案:

答案 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}}中创建服务并使用标签将其他类加载到其中必需的。

希望这是有道理的,也许其他人会有更好的解决方案,我也有兴趣听到,因为这也是我现在正在努力解决的问题。