Устранение неисправностей Ошибка "Контроллер для URI не вызываемый"
Я работаю над Symfony 2.3, и я объявил новый маршрут и новый контроллер, но когда я вызываю этот контроллер из браузера Я получаю эту ошибку:
The controller for URI "/user/1" is not callable. in /dev.mydomain.org/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php at line 82
Это моя простая конфигурация route:
user_homepage:
pattern: /user
defaults: { _controller: UserBundle:Default:index }
user_show:
pattern: /user/{id}
defaults: { _controller: UserBundle:Default:show }
requirements:
id: \d+
И это мой очень простой контроллер:
public function showUserAction($id)
{
return $this->render('UserBundle:Default:show.html.twig', array());
}
Что не так?
Ответы
Ответ 1
Логическое имя UserBundle:Default:show
относится к UserBunde\Controller\DefaultController::showAction
, у вас есть метод под названием showUserAction
.
Или измените имя метода на showAction
или измените логическое имя на UserBundle:Default:showUser
.
Ответ 2
Хотя это не относится к приведенному примеру, эта ошибка также может быть вызвана, если действие контроллера не является общедоступным.
Ответ 3
Вы определяете свою функцию контроллера как showUserAction
, а в определении - show[Action]
.
Либо измените конфигурацию маршрута
user_show:
pattern: /user/{id}
defaults: { _controller: UserBundle:Default:showUser }
requirements:
id: \d+
или изменить подпись контроллера
public function showAction($id)
{
Посмотрите, помогает ли это
Ответ 4
После большого поиска это сработало для меня:
1.- Создать CRUDController
// src/Acme/DemoBundle/Controller/CRUDController.php
namespace Acme\DemoBundle\Controller;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Inter\PimeBundle\Entity\Empresa;
class CRUDController extends Controller
{
public function publicarAction($id)
{
//code here...
}
}
2.- Создайте сервис
# app/config/config.yml
services:
ebtity.admin.service:
class: Acme\DemoBundle\Admin\EntityAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: group, label: label }
arguments:
- NULL
- Acme\DemoBundle\Entity\Entity
- AcmeDemoBundle:EntityAdmin
3.- Создайте шаблон для кнопки действий
{# src/Acme/DemoBundle/Resources/views/CRUD/list__action_publicar.html.twig #}
<a class="btn btn-sm" href="{{ admin.generateObjectUrl('publicar', object) }}">Publicar</a>
4.- Настроить маршрут
// src/Acme/DemoBundle/Admin/EntityAdmin.php
namespace Acme\DemoBundle\Admin;
// ...
use Sonata\AdminBundle\Route\RouteCollection;
class EntityAdmin extends Admin
{
// ...
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name')
->add('engine')
->add('rescueEngine')
->add('createdAt')
->add('_action', 'actions', array(
'actions' => array(
'publicar' => array(
'template' => 'AcmeDemoBundle:CRUD:list__action_publicar.html.twig'
)
)
));
}
protected function configureRoutes(RouteCollection $collection)
{
$collection
->add('publicar',
$this->getRouterIdParameter().'/publicar',
array('_controller' => 'AcmeDemoBundle:CRUD:publicar')
);
}
}
5.- Очистить кеш
Надеюсь, что это поможет
Ответ 5
Не здесь. Но есть и другая проблема:
Если вы забудете суффикс "Действие", все будет работать. Но когда вы поняли, что вы забыли суффикс, а затем добавьте его... сюрприз! Та же ошибка, что и OP.
Проблема здесь в кешировании
Symfony создает два файла для кэширования URL-адресов:
- AppDevUrlGenerator.php
- AppDevUrlMatcher.php
Если вы измените свое имя действия (например, добавив суффикс "Действие" ), то эта информация кэша устарела.
Решение
php app/console cache:clear
Ответ 6
Подобно принятому ответу, если ваш контроллер определен как услуга, например. (в YAML):
services:
user.default:
class: \UserBundle\DefaultController
И ваш маршрут использует этот сервис контроллера:
user_show:
pattern: /user/{id}
defaults: { _controller: user.default:showUserAction }
requirements:
id: \d+
Затем необходимо указать метод действия в полном объеме, включая суффикс Action
, иначе вы получите ошибку "контроллер... не вызываемой".
Ответ 7
В моем случае я использовал symfony 2.
Предыдущая версия Symfony поддерживает соглашение об именах методов. Суффикс метода должен содержать слово действия.
Пример:
в файле маршрута yml определение метода было
docudex_report_make_authorization:
pattern: /make-authorization
defaults: { _controller: DocudexReportBundle:Default:makeAuthorization }
и в контроллере метод был
public function makeAuthorization(){}
поэтому я получаю ошибку.
После изменения имени метода на public function makeAuthorizationAction
он работал отлично.
Ответ 8
Я хотел бы поделиться своим опытом & как я это решил:
Я импортировал один пакет в приложение, маршруты которого были определены с помощью аннотаций, и они также импортировали штраф в приложении, используя:
auth_bundle_routes:
# loads routes from the given routing file stored in some bundle
resource: '@XyzAuthBundle/Controller/'
type: annotation
Но так как мои контроллеры комплектов были определены с использованием сервисов, Symfony показывал ошибку:
Контроллер для URI "/facebook/request-code" не вызывается. Требуется контроллер Xyz\AuthBundle\Controller\FacebookController " аргументы конструктора и не существует в контейнере. Ты забыли определить такой сервис?
Я обновил свой пакет для маршрутизации, чтобы использовать файл routing.yaml над аннотациями и называть контроллеры синтаксисом service::method
, а затем эта ошибка исчезла.
xyz_auth.facebook_request_code:
path: /facebook/request-code
controller: xyz_auth.controller.facebook_controller::requestCode
Маршруты пакетов должны быть импортированы с использованием
auth_bundle_routes:
resource: '@XyzAuthBundle/Resources/config/routing.yaml'
Надеюсь, это сэкономит кому-то время.
Ответ 9
Одна из причин этой ошибки заключается в том, что вы пропустили добавление слова "Действие" после имени метода контроллера. Если вы считаете, что ваша маршрутизация в порядке, проверьте имя метода.