Symfony “故障排除”;URI的控制器不可调用";错误

Symfony “故障排除”;URI的控制器不可调用";错误,symfony,routes,Symfony,Routes,我正在使用Symfony 2.3,我声明了一条新的路线和一个新的控制器,但当我从浏览器调用此控制器时,出现以下错误: URI“/user/1”的控制器不可调用。在第82行的/dev.mydomain.org/vendor/symfony/symfony/src/symfony/Component/HttpKernel/Controller/ControllerResolver.php中 这是我的简单路线配置: user\u主页: 模式:/user 默认值:{u控制器:用户绑定:默认值:索引} 用

我正在使用Symfony 2.3,我声明了一条新的路线和一个新的控制器,但当我从浏览器调用此控制器时,出现以下错误:

URI“/user/1”的控制器不可调用。在第82行的/dev.mydomain.org/vendor/symfony/symfony/src/symfony/Component/HttpKernel/Controller/ControllerResolver.php中

这是我的简单路线配置:

user\u主页:
模式:/user
默认值:{u控制器:用户绑定:默认值:索引}
用户展示:
模式:/user/{id}
默认值:{u控制器:用户绑定:默认值:显示}
要求:
id:\d+
这是我非常简单的控制器

公共函数showUserAction($id)
{        
返回$this->render('UserBundle:Default:show.html.twig',array());
}

怎么了?

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

或者更改路由配置

user_show:
    pattern:  /user/{id}
    defaults: { _controller: UserBundle:Default:showUser }
    requirements:
        id:  \d+
或者更改控制器签名

public function showAction($id)
{

查看这是否有帮助逻辑名称
UserBundle:Default:show
指的是
UserBunde\Controller\DefaultController::showAction
您有一个名为
showUserAction
的方法


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

虽然与给定的示例不相关,但如果控制器操作不是公共的,也可能导致此错误。此错误的原因之一是您没有添加“操作”一词在控制器的方法名称之后。如果您认为您的路由是正常的,请检查方法名称。

在大搜索之后,这对我很有用:

1.创建积垢控制器

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


希望它有帮助

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

如果您忘记了“Action”后缀,那么所有这些都将起作用。但是当你意识到你忘记了后缀然后加上它。。。惊喜与OP相同的错误

这里的问题是缓存

Symfony为缓存URL创建两个文件:

  • AppDevUrlGenerator.php
  • AppDevUrlMatcher.php
如果更改动作名称(即添加“动作”后缀),则该缓存信息已过时

解决方案

php app/console cache:clear

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

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

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

然后有必要完整地命名动作方法,包括
动作
后缀,否则会出现“controller…is not callable”错误。

在我的例子中,我使用的是symfony2

symfony的早期版本维护方法命名约定。方法后缀应包含操作单词

例如:

在route yml文件中,方法定义为

docudex_report_make_authorization:
pattern:  /make-authorization
defaults: { _controller: DocudexReportBundle:Default:makeAuthorization }
在控制器中,方法是

public function makeAuthorization(){}
因此,我得到了错误


将方法名称更改为
公共函数makeAuthorizationAction
后,它工作得非常好。

我想分享我的经验和解决方法:

我在一个应用程序中导入了一个bundle,它的路由是使用注释定义的,它们在应用程序中也可以使用:

auth_bundle_routes:
  # loads routes from the given routing file stored in some bundle
  resource: '@XyzAuthBundle/Controller/'
  type:     annotation
但由于my bundle控制器是使用服务定义的,因此Symfony显示错误:

URI“/facebook/请求代码”的控制器不可调用。 控制器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'

希望这能节省一些人的时间。

我故意省略了供应商的名称。不管怎样,它现在起作用了。非常感谢。今天是辛苦的一天。+1和facepalm,我忘记了函数名的动作部分。非常感谢。我改变了主意,通过ajax调用哪个方法,另一个方法是pri造成这个错误的原因。让我难堪了整整15分钟。谢谢你。谢谢你这个答案帮助了我
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'