未生成子管理员路由 - Sonata Admin Bundle

时间:2015-02-20 18:55:24

标签: symfony sonata-admin symfony-sonata sonata

我试图将管理员设置为Sonata Admin Bundle中其他管理员的子女。

我有2个管理员课程:

  • CategoryAdmin
    该类包含以下方法

    protected function configureSideMenu(MenuItemInterface $menu, $action, AdminInterface $childAdmin = null)
    {            
         $id = $this->getRequest()->get('id');
    
         $menu->addChild(
             $this->trans('Projects'),
             array('uri' => $this->getChild('sonata.admin.project')->generateUrl('list', array('id' => $id)))
         );
    }
    
  • ProjectAdmin
    该课程包含protected $parentAssociationMapping = 'category';
    category是表示ManyToOne关联的模型类中的属性。

我在CategoryAdmin的服务配置中添加了以下行

calls:
    - [ addChild, ["@sonata.admin.project"]]

使用此配置不会生成子管理员的路由。 SideMenu(顶部菜单)中的链接指向/admin/project/list?childId=1&id=1

以下是CategoryAdmin dump()

的孩子的输出结果
array:1 [▼
    "sonata.admin.project" => ProjectAdmin {#406 ▶}
]

这意味着我的孩子管理员的配置似乎是正确的。我不知道为什么没有生成子管理员的路由。

我希望有人能给我一个提示,问题可能是什么。

3 个答案:

答案 0 :(得分:2)

下一代奏鸣曲编码员的注意事项: 如果您的路线没有生成,请先检查您没有:

protected function configureRoutes(RouteCollection $collection)
{
    //clear all routes except given !!!
    $collection->clearExcept(array('list', 'show'));
}

我花了两天时间......

答案 1 :(得分:0)

您的管理类中是否有$ baseRouteName和$ baseRoutePattern覆盖?

如果这样做,Sonata将生成具有相同名称的子路由和父路由,从而导致父路由覆盖子路由。

答案 2 :(得分:0)

我在自己解决问题时遇到了这个问题,决定分享解决方案,这花了我几个小时的调试时间...

在这种情况下生成正确 uri 的唯一方法是使用 低级 routeGenerator,它不提供任何奏鸣曲建议,在 generateMenuUrl 方法中进行。

首先,您必须调试应用中的路由(包括由奏鸣曲自动生成的)。

<块引用>

php bin/console debug:router

例如我有 3 个嵌套级别

<块引用>

大厅 -> 座位方案 -> 扇区

我的路线如下:

  adminHall_list                             ANY      ANY      ANY    /admin/hall/list
  adminHall_create                           ANY      ANY      ANY    /admin/hall/create
  adminHall_edit                             ANY      ANY      ANY    /admin/hall/{id}/edit
  adminHall_delete                           ANY      ANY      ANY    /admin/hall/{id}/delete
  adminHall_adminScheme_list                 ANY      ANY      ANY    /admin/hall/{id}/scheme/list
  adminHall_adminScheme_create               ANY      ANY      ANY    /admin/hall/{id}/scheme/create
  adminHall_adminScheme_edit                 ANY      ANY      ANY    /admin/hall/{id}/scheme/{childId}/edit
  adminHall_adminScheme_delete               ANY      ANY      ANY    /admin/hall/{id}/scheme/{childId}/delete
  adminHall_adminScheme_adminSector_list     ANY      ANY      ANY    /admin/hall/{id}/scheme/{childId}/sector/list
  adminHall_adminScheme_adminSector_create   ANY      ANY      ANY    /admin/hall/{id}/scheme/{childId}/sector/create
  adminHall_adminScheme_adminSector_edit     ANY      ANY      ANY    /admin/hall/{id}/scheme/{childId}/sector/{childChildId}/edit
  adminHall_adminScheme_adminSector_delete   ANY      ANY      ANY    /admin/hall/{id}/scheme/{childId}/sector/{childChildId}/delete

在管理类中 baseRouteName 和 baseRoutePattern 已被覆盖。

// HallSchemeAdmin.php
$this->baseRouteName = 'adminScheme';
$this->baseRoutePattern = 'scheme';

要生成最深度列表网址

$url = $admin->getRouteGenerator()->generate('adminHall_adminScheme_adminSector_list', [
    'id' => $admin->getRequest()->get('id'),
    'childId' => 555, // put required id
]);

它会产生这样的网址:

/admin/hall/495/scheme/555/sector/list

如果您需要编辑网址,您还必须提供childChildId参数:

$url = $admin->getRouteGenerator()->generate('adminHall_adminScheme_adminSector_edit', [
    'id' => $admin->getRequest()->get('id'),
    'childId' => 555, 
    'childChildId' => 12345 
]);

结果是: /admin/hall/495/scheme/555/sector/12345/edit