【发布时间】:2014-11-02 15:12:43
【问题描述】:
我刚开始使用 Symfony 并坚持使用“捆绑包”。假设我想实现一个管理面板,它允许管理员:
- 管理产品
- 管理文章
- 管理新闻
如何实现这样的管理面板?管理面板是否应该与产品/新闻/文章的单独控制器捆绑在一起?或者我应该将产品/新闻/文章放入自己的捆绑包中,然后(也许)将它们分组到“管理”捆绑包中(不确定是否可能)。
【问题讨论】:
我刚开始使用 Symfony 并坚持使用“捆绑包”。假设我想实现一个管理面板,它允许管理员:
如何实现这样的管理面板?管理面板是否应该与产品/新闻/文章的单独控制器捆绑在一起?或者我应该将产品/新闻/文章放入自己的捆绑包中,然后(也许)将它们分组到“管理”捆绑包中(不确定是否可能)。
【问题讨论】:
根据最近发布的Symfony Best Practices:
只为您的应用程序逻辑创建一个名为 AppBundle 的包
创建单独的捆绑包,只有它们可以作为独立软件重复使用。当然,可以将例如 Admin 和 Front 包分开,但这只是为了代码的清晰。
【讨论】:
如果您正在寻找管理面板的快速实现,SonataAdminBundle 值得一看。
您通过 composer 安装并导入一些路由,然后从那里定义管理服务以及引用您的 Products、News 和 Article 实体的类。
我喜欢它,因为它是可扩展的并且设置起来非常快。除了过滤表单之外,它还可以通过将一个管理界面嵌入另一个开箱即用的管理界面来处理实体之间的关系,并在每个实体的基础上启用/禁用路由。此外,树枝模板是超级模块化的,可以轻松覆盖。
作为一个简单的例子(假设 ORM),一旦你安装了 SonataAdmin,添加一个服务定义:(例如取自 Sonata Admin Docs)
services:
sonata.admin.pprodut:
class: Acme\DemoBundle\Admin\ProductAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: "Content", label: "Product" }
arguments:
- ~
- Acme\DemoBundle\Entity\Product
- ~
... 以及要匹配的 ProductAdmin 类。
<?php
// src/Acme/DemoBundle/Admin/ProductAdmin.php
namespace Acme\DemoBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
class ProductAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('title', 'text', array('label' => 'Product Title'))
->add('sku', 'text')
->add('description') //if no type is specified, SonataAdminBundle tries to guess it
// Other fields ...
;
}
// Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('title')
->add('sku')
;
}
// Fields to be shown on lists
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('title')
->add('sku')
;
}
}
你要去参加比赛了。
但是,如果这是对您的练习,而不是可能的轮子改造,SonataAdmin 仍然可以作为一个很好的参考包。 :)
【讨论】: