Маршрут дочернего администратора не создается - пакет администрирования 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"]]

Маршруты для дочернего администратора не создаются с этой конфигурацией. Ссылка в боковом меню (верхнее меню) указывает на /admin/project/list?childId=1&id=1

Вот результат дочерних элементов CategoryAdmin с dump()

array:1 [▼
    "sonata.admin.project" => ProjectAdmin {#406 ▶}
]

Это означает, что конфигурация моего дочернего администратора кажется правильной. Понятия не имею, почему не создаются маршруты для дочернего админа.

Надеюсь, кто-нибудь подскажет, в чем может быть проблема.


person temparus    schedule 20.02.2015    source источник


Ответы (3)


У вас есть переопределение $ baseRouteName и $ baseRoutePattern в вашем классе администратора?

Если вы это сделаете, Sonata сгенерирует и дочерний, и родительский маршруты с одинаковыми именами, в результате чего родительские маршруты переопределят дочерние.

person jvasseur    schedule 06.07.2015
comment
Нет никакого способа обойти это? Мне нужно определить $baseRouteName и $baseRoutePattern, потому что в противном случае Sonata не будет использовать мой пакет без поставщика (например, src / AppBundle /) - person Matthew Webb; 10.12.2015
comment
Если использование SonataAdminBundle версии dev-master не является проблемой, значит, ошибка была решена в нем (github.com/sonata-project/SonataAdminBundle/pull/3250). В противном случае вы можете переопределить getBaseRoutePattern и getBaseRouteName, чтобы исправить поведение. - person jvasseur; 21.01.2016

Примечание для кодировщиков сонаты следующего поколения: если ваш маршрут не создается, сначала проверьте, что вы этого не сделали:

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

Мне это стоит два дня ...

person d3uter    schedule 06.11.2016
comment
Наверное, только что сэкономил мне пару дней! - person OK sure; 21.03.2018

Я столкнулся с этой проблемой, решая проблему для себя, и решил поделиться решением, которое стоило мне нескольких часов отладки ...

Единственный способ сгенерировать правильный uri в этом случае - использовать низкоуровневый routeGenerator, который не делает никаких предложений сонаты, сделанных внутри метода generateMenuUrl.

Сначала вам нужно отладить маршруты, которые есть в вашем приложении (в том числе автоматически сгенерированные сонатой).

php bin / отладка консоли: маршрутизатор

Например у меня есть 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-адрес в списке:

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

Будет создан URL-адрес, подобный этому:

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

Если вам нужно изменить URL, вам также необходимо указать параметр 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

person Yehor    schedule 11.01.2021