我正在开发 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());
}
有什么问题?
答案 0 :(得分:68)
逻辑名称UserBundle:Default:show
是指UserBunde\Controller\DefaultController::showAction
您有一个名为showUserAction
的方法。
将方法名称更改为showAction
或将逻辑名称更改为UserBundle:Default:showUser
。
答案 1 :(得分:16)
虽然与给出的示例无关,但如果控制器Action不是公共
,也可能导致此错误答案 2 :(得分:3)
您将控制器功能定义为showUserAction
,而在定义中您称其为show[Action]
。
更改路线配置
user_show:
pattern: /user/{id}
defaults: { _controller: UserBundle:Default:showUser }
requirements:
id: \d+
或更改您的控制器签名
public function showAction($id)
{
看看这是否有帮助
答案 3 :(得分:2)
经过大搜索,这对我有用:
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.-清除缓存
希望有所帮助
答案 4 :(得分:0)
这里不是这样的。但还有另一个相关问题:
如果您忘记了'Action'后缀,那么一切都会有效。但是当你意识到你忘记了后缀然后添加它...惊喜!与OP相同的错误。
这里的问题是关于缓存
Symfony为缓存网址创建了两个文件:
如果您更改了操作名称(即添加“操作”后缀),则该缓存信息已过时。
<强>解决方案强>
php app/console cache:clear
答案 5 :(得分:0)
与接受的答案类似,如果您的控制器被定义为服务,例如(在YAML):
user_show:
pattern: /user/{id}
defaults: { _controller: user.default:showUserAction }
requirements:
id: \d+
您的路线使用此控制器服务:
Action
然后有必要将操作方法命名为完整,包括String sql = "UPDATE employees set ID= '"+ idVal+"', Name = '"+ nameVal +"', Gender ='"+ genderVal+"', DOB='"+ dobVal+"', Address ='"+ addressVal+"', Postcode ='"+ postcodeVal+"', NIN ='"+ ninVal+"', JobTitle='"+ jobVal+"', StartDate ='"+ startDateVal+"', Salary ='"+ salaryVal+"', Email='"+ emailVal+"', Images='"+ img+" WHERE ID= '"+ idVal+"'";
后缀,否则您将获得&#34;控制器...不可调用&# 34;错误。
答案 6 :(得分:0)
就我而言,我使用的是 symfony 。
symfony的先前版本维护方法命名约定。方法后缀应包含 Action 词。
示例:
在yml路由文件中,方法定义为
docudex_report_make_authorization:
pattern: /make-authorization
defaults: { _controller: DocudexReportBundle:Default:makeAuthorization }
,在控制器中,方法是
public function makeAuthorization(){}
因此我遇到了错误。
将方法名称更改为public function makeAuthorizationAction
后,它可以正常工作。
答案 7 :(得分: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”的控制器不可调用。 控制器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'
希望这可以节省别人的时间。
答案 8 :(得分:-1)
此错误的原因之一是您错过了在控制器的方法名称后添加“Action”一词。如果您认为路由正常,请检查方法名称。