Symfony “故障排除”;URI的控制器不可调用";错误
我正在使用Symfony 2.3,我声明了一条新的路线和一个新的控制器,但当我从浏览器调用此控制器时,出现以下错误: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控制器:用户绑定:默认值:索引} 用
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'