Пользовательский метод не найден при расширении администратора страницы Sonata

#php #symfony #inheritance #sonata

#php #symfony #наследование #sonata

Вопрос:

Мы использовали простые расширения для расширения администратора страницы Sonata. Итак, теперь у меня есть класс, который выглядит следующим образом:

 class PageAdmin extends BasePageAdmin
{
    public function configureRoutes(RouteCollection $collection)
    {
        parent::configureRoutes($collection);

        $collection->add( 'send_page_emails', '/admin/send-page-emails');
    }
    ...
}
  

… и мой пользовательский PageAdminController класс включает в себя следующую функцию:

 protected function sendPageEmailsAction()
{
    die('Here I am!');
}
  

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

Вызов неопределенного метода SonataAdminBundleController CRUDController::sendPageEmailsAction

Как я могу заставить приложение искать в правильном месте для моего действия?

===

Редактировать: Вот соответствующие части admin.yml .

 sonata.page.admin.page:
    class: ApplicationSonataPageBundleAdminPageAdmin
    arguments: [~, '%sonata.page.admin.page.entity%', SonataPageBundle:PageAdmin]
    tags:
        - { name: sonata.admin, manager_type: orm, group: admin, label: Seiten }
    calls:
        - [ addChild, ['@sonata.page.admin.block']]
        - [ addChild, ['@sonata.page.admin.snapshot']]
        - [ setPageManager, ['@sonata.page.manager.page']]
        - [ setCacheManager, ['@sonata.cache.manager']]
        - [ setSiteManager, ['@sonata.page.manager.site']]
        - [ setTranslationDomain, ['SonataPageBundle']]
        - [ setTemplate, ['edit', 'ApplicationSonataPageBundle:PageAdmin:edit_duplicate.html.twig']]
        - [ setTemplate, ['tree', 'SonataPageBundle:PageAdmin:tree.html.twig']]
        - [ setTemplate, ['compose', 'ApplicationSonataPageBundle:PageAdmin:compose.html.twig']]
        - [ setTemplate, ['create', 'SonataAdminBundle:CRUD:edit.html.twig']]
        - [ setTemplate, ['select_site', 'SonataPageBundle:PageAdmin:select_site.html.twig']]
        - [ setTemplate, ['list', 'SonataPageBundle:PageAdmin:list.html.twig']]
        - [ setTemplate, ['compose_container_show', 'SonataPageBundle:PageAdmin:compose_container_show.html.twig']]
  

Комментарии:

1. Вы следовали инструкциям на symfony.com/doc/master/bundles/SonataAdminBundle/cookbook /… для создания пользовательского действия? Третьим аргументом вашей службы администрирования должен быть ваш PageAdminController. Ошибка, с которой вы столкнулись, может заключаться в том, что вы оставили CRUDController Sonata по умолчанию

2. Спасибо. Я только что добавил содержимое admin.yml к вопросу после прочтения вашего комментария. На первый взгляд кажется, что используется правильный контроллер.

3. Может быть, глупый вопрос, но вы очистили свой кеш?

4. Я также заметил, что ваша sendPageEmailsAction защищена, я думаю, она должна быть общедоступной

5. Кэш был очищен — в итоге он стал защищенной функцией. Это исправлено, сделав его общедоступным. Если вы создадите ответ, в котором будет указано это изменение, я буду рад пометить его как правильный.

Ответ №1:

В контроллере администратора метод действия должен быть общедоступным и не защищенным, иначе Sonata не сможет найти метод для вашего действия :

 <?php

namespace ApplicationSonataPageBundleController;

use SonataAdminBundleControllerCRUDController;

class PageAdminController extends CRUDController
{
   public function sendPageEmailsAction()
   {
       // your code here
   }
}