Symfony SonatAdminBundle:同一实体的多个管理部分

Symfony SonatAdminBundle:同一实体的多个管理部分,symfony,symfony-sonata,sonata-admin,Symfony,Symfony Sonata,Sonata Admin,我有一个实体类Page,列type=integer。当我这样做时: <service id="sonata.admin.pages" class="Main\ProgramBundle\Admin\PageAdmin"> <tag name="sonata.admin" manager_type="orm" group="dashboard" label="Pages"/> <argument /> <argum

我有一个实体类
Page
,列
type=integer
。当我这样做时:

   <service id="sonata.admin.pages" class="Main\ProgramBundle\Admin\PageAdmin">
      <tag name="sonata.admin" manager_type="orm" group="dashboard" label="Pages"/>
      <argument />
      <argument>Main\ProgramBundle\Entity\Page</argument>
      <argument>SonataAdminBundle:CRUD</argument>
  </service>


   <service id="sonata.admin.groups" class="Main\ProgramBundle\Admin\GroupAdmin">
      <tag name="sonata.admin" manager_type="orm" group="stories" label="Groups"/>
      <argument />
      <argument>Main\ProgramBundle\Entity\Page</argument>
      <argument>SonataAdminBundle:CRUD</argument>
  </service>

Main\ProgramBundle\Entity\Page
索纳塔:积垢
Main\ProgramBundle\Entity\Page
索纳塔:积垢
简而言之,这两个部分都处理同一个实体,只是每个部分都有不同的查询和表单


但实际情况是,sonata总是执行Admin/GroupAdmin,即使我选择了PageAdmin。如何执行此操作?

Sonata会根据实体名称自动创建路由。因此,如果您有两个管理类,则存在冲突。您必须配置不同的路由模式

将此属性添加到Main\ProgramBundle\Admin\GroupAdmin.php:

protected $baseRouteName = 'page_group';
protected $baseRoutePattern = 'page-group';

我没有足够的声誉在前面的回答中添加评论,但缺少以下信息:

除了管理类中的$baseRoutePattern之外,还需要定义唯一的$baseRouteName值:

protected $baseRouteName = 'admin_vendor_bundlename_adminclassname';

protected $baseRoutePattern = 'unique-route-pattern';

你只需要对一个类做这件事,但是考虑一下这两个类,以清楚地知道发生了什么。

你当然找到了你的解决方案,但是另一种方法是创建父类并使用它继承。这样,您就可以拥有不同的存储库,sonata admin也不会有不同的工作方式。

我做到了,现在两个url都是
admin/page group/list
,即使我将这些属性(当然是不同的)放在PageAdmin和GroupAdmin中:(不要将此属性同时放在两个类中。您应该只将此属性放在一个管理类中。如果同时放在这两个类中,您将遇到与以前相同的冲突情况。我尝试的第一件事与您所说的完全一样;只将此属性放在一个管理类中。这不起作用,仅在这之后,我尝试了两种情况。受保护的$baseRouteName为了正常工作,也需要使用。我首先尝试使用扩展我的原始实体的实体-但是
控制台原则:schema:update
失败,因为您尝试创建同一个表两次-或者更糟,您在数据库中有两个表。当您将此实体添加到另一个管理员时,您仍然会遇到问题。Sonata将igger一个错误,告诉您有到多个管理员注册。这是通过在add函数中添加'admin_code'=>'sonata.product.admin.product'来修复的。这将告诉sonata具体使用哪个管理员。谢谢!@11mb我在刚刚添加的一个节目中遇到了问题。
->add('someProperty',null,array('admin_code'=>'some.service.admin,id'))