2013-07-30 25 views
18

我的工作Symfony的2.3,我宣佈一個新的路線和新控制器,但是當我把這個控制器從瀏覽器中我得到這個錯誤:故障排除「的控制器URI是不可調用的」錯誤

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

有什麼不對?

回答

64

邏輯名稱UserBundle:Default:showUserBunde\Controller\DefaultController::showAction有一個名爲showUserAction方法。

將方法名稱更改爲showAction或將邏輯名稱更改爲UserBundle:Default:showUser

+0

我故意忽略的供應商的名稱。無論如何它現在有效。 非常感謝。今天是艱難的一天的工作。 –

+9

+1和facepalm,我忘了我的函數名稱的操作部分。 – HMR

2

您正在將您的控制器功能定義爲showUserAction,而在定義中您說的是show[Action]

要麼改變你的路由配置

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

或更改控制器的簽名

public function showAction($id) 
{ 

看看這有助於

15

雖然如果控制器動作是不公開的

+0

非常感謝你。 Id改變了我的想法,通過ajax調用哪個方法,另一個方法是私有的,導致了這個錯誤。讓我難倒了15分鐘。謝謝=) – azzy81

+0

謝謝你這個答案幫助了我。 +1 – Androidbirt

-1

其中的一個原因這個錯誤是你錯過了之後控制器的添加的「行動」一詞不相關的給予,這個錯誤也可能導致的例子方法名稱。如果您認爲路由正常,請檢查方法名稱。

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

希望它可以幫助

0

不是這裏的情況。但還有另外一個相關問題:

如果你忘記'Action'後綴,所有的都會工作。但是,當你意識到你忘記了後綴,然後添加它......驚喜!與OP相同的錯誤。

這裏的問題是有關緩存

的Symfony創建兩個文件緩存的URL:

  • AppDevUrlGenerator.php
  • AppDevUrlMatcher.php

如果你改變你的動作名稱(即添加'Action'後綴),那麼該緩存信息已過時。

解決方案

php app/console cache:clear 
0

類似於接受的答案,如果你的控制器被定義爲服務,例如(在YAML):

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

而且你的路由使用該控制器服務:

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

然後有必要的全名包括Action後綴操作方法,否則你會得到「控制器...不可調用「錯誤。