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



我有带有列type=integer的实体类Page。当我这样做时:

   <service id="sonata.admin.pages" class="MainProgramBundleAdminPageAdmin">
      <tag name="sonata.admin" manager_type="orm" group="dashboard" label="Pages"/>
      <argument />
      <argument>MainProgramBundleEntityPage</argument>
      <argument>SonataAdminBundle:CRUD</argument>
  </service>

   <service id="sonata.admin.groups" class="MainProgramBundleAdminGroupAdmin">
      <tag name="sonata.admin" manager_type="orm" group="stories" label="Groups"/>
      <argument />
      <argument>MainProgramBundleEntityPage</argument>
      <argument>SonataAdminBundle:CRUD</argument>
  </service>

简而言之,这两个部分都处理同一个实体,只是每个部分都有不同的查询和表单。

但是发生的情况是,即使我选择PageAdmin,sonata总是执行Admin/GroupAdmin。怎么做?

我没有足够的声誉来为之前的答案添加评论,但它缺少以下信息:

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

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

你只需要对一个类执行此操作,但请考虑在两个类中都这样做,以保持清楚发生了什么。

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

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

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

我不知道 2012 年的情况如何,但在 2022 年,这一切都在官方文档中的路由页面上。

可以覆盖每个管理员中的generateBaseRouteNamegenerateBaseRoutePattern方法,以控制哪个名称(例如 <a href="{{ path('admin_app_post_list') }}">Post List</a> ) 和路由具有的 URL。

// src/Admin/PostAdmin.php
final class PostAdmin extends AbstractAdmin
{
    protected function generateBaseRouteName(bool $isChildAdmin = false): string
    {
        return 'sonata_post';
        // will result in routes named:
        //   sonata_post_list
        //   sonata_post_create
        //   etc
    }
    protected function generateBaseRoutePattern(bool $isChildAdmin = false): string
    {
        return 'Post';
    }
}

巴里的回答似乎仍然有效,但也许它有不必要的副作用,我不知道。

您当然找到了解决方案,但另一种方法是创建一个父类并使用继承映射进行继承。然后,您可以拥有不同的存储库,并且Sonata管理员的工作方式不会有所不同。

最新更新