疑难解答“URI的控制器不可调用”错误

时间:2013-07-30 09:07:07

标签: symfony routing

我正在开发 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());
}

有什么问题?

9 个答案:

答案 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为缓存网址创建了两个文件:

  • AppDevUrlGenerator.php
  • AppDevUrlMatcher.php

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

<强>解决方案

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”一词。如果您认为路由正常,请检查方法名称。