#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
}
}