29

我正在使用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

这是我的简单路由配置:

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());
}

怎么了?

4

9 回答 9

74

逻辑名称UserBundle:Default:show是指UserBunde\Controller\DefaultController::showAction您有一个名为showUserAction.

将方法名称更改为showAction或将逻辑名称更改为UserBundle:Default:showUser

于 2013-07-30T09:11:54.957 回答
20

尽管与给出的示例无关,但如果控制器 Action 不是公共的,也可能导致此错误

于 2013-10-31T03:35:26.577 回答
4

您正在定义您的控制器功能,showUserAction而在定义中您说它是show[Action]

更改您的路线配置

user_show:
    pattern:  /user/{id}
    defaults: { _controller: UserBundle:Default:showUser }
    requirements:
        id:  \d+

或更改您的控制器签名

public function showAction($id)
{

看看这是否有帮助

于 2013-07-30T09:11:17.137 回答
3

经过大量搜索,这对我有用:

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.- 清除缓存

希望能帮助到你

于 2014-11-19T15:11:25.040 回答
1

不是这里的情况。但是还有另一个相关的问题:

如果您忘记了“Action”后缀,一切都会起作用。但是当你意识到你忘记了后缀然后添加它时......惊喜!与OP相同的错误。

这里的问题是关于缓存

Symfony 创建两个用于缓存 url 的文件:

  • AppDevUrlGenerator.php
  • AppDevUrlMatcher.php

如果您更改操作名称(即添加“操作”后缀),则该缓存信息已过时。

解决方案

php app/console cache:clear
于 2015-03-26T10:45:32.430 回答
0

与接受的答案类似,如果您的控制器被定义为服务,例如(在 YAML 中):

services:
    user.default:
        class: \UserBundle\DefaultController

您的路线使用此控制器服务:

user_show:
    pattern:  /user/{id}
    defaults: { _controller: user.default:showUserAction }
    requirements:
        id:  \d+

然后需要完整地命名动作方法,包括Action后缀,否则你会得到“控制器......不可调用”错误。

于 2016-12-21T16:25:57.547 回答
0

就我而言,我使用的是symfony 2。

symfony 的早期版本维护方法命名约定。方法后缀应包含Action字样。

例子:

在路由 yml 文件中,方法定义是

docudex_report_make_authorization:
pattern:  /make-authorization
defaults: { _controller: DocudexReportBundle:Default:makeAuthorization }

在控制器中,方法是

public function makeAuthorization(){}

因此我得到了错误。

将方法名称更改为public function makeAuthorizationAction它后,效果很好。

于 2019-07-28T09:11:19.720 回答
0

我想分享我的经验以及我是如何解决的:

我正在一个应用程序中导入一个包,其路由是使用注释定义的,并且它们也可以通过以下方式在应用程序中正常导入:

auth_bundle_routes:
  # loads routes from the given routing file stored in some bundle
  resource: '@XyzAuthBundle/Controller/'
  type:     annotation

但由于我的捆绑控制器是使用服务定义的,Symfony 显示错误:

URI“/facebook/request-code”的控制器不可调用。Controller 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'

希望这会节省某人的时间。

于 2019-09-28T15:39:05.383 回答
-1

此错误的原因之一是您错过了在控制器的方法名称后添加单词“Action”。如果您认为您的路由没问题,请检查方法名称。

于 2014-07-04T08:41:16.487 回答