Устранение неисправностей Ошибка "Контроллер для 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

Одна из причин этой ошибки заключается в том, что вы пропустили добавление слова "Действие" после имени метода контроллера. Если вы считаете, что ваша маршрутизация в порядке, проверьте имя метода.