2013-07-30 37 views
18

tôi đang làm việc trên Symfony 2.3 và tôi tuyên bố một tuyến mới và mới khiển, nhưng khi tôi gọi điều khiển này từ trình duyệt tôi nhận được lỗi này :đáp thắc mắc "Bộ điều khiển cho URI không callable" lỗi

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

Đây là tuyến đường đơn giản của tôi cấu hình:

user_homepage: 
    pattern: /user 
    defaults: { _controller: UserBundle:Default:index } 

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

Và điều này rất đơn giản của tôi khiển:

public function showUserAction($id) 
{   
    return $this->render('UserBundle:Default:show.html.twig', array()); 
} 

Điều gì là sai?

Trả lời

64

Tên logic UserBundle:Default:show đề cập đến UserBunde\Controller\DefaultController::showAction bạn có một phương pháp gọi là showUserAction.

Hoặc đổi tên phương thức thành showAction hoặc đổi tên hợp lý thành UserBundle:Default:showUser.

+0

Tên của nhà cung cấp mà tôi đã bỏ qua với mục đích. Dù sao nó hoạt động ngay bây giờ. Cảm ơn bạn rất nhiều. Hôm nay là một ngày làm việc vất vả. –

+9

+1 và facepalm, tôi quên phần Hành động của tên hàm của mình. – HMR

2

Bạn đang xác định chức năng điều khiển của mình là showUserAction trong khi ở định nghĩa bạn nói là show[Action].

Hoặc thay đổi cấu hình tuyến đường của bạn

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

hoặc thay đổi chữ ký điều khiển của bạn

public function showAction($id) 
{ 

Xem nếu điều này giúp

15

Mặc dù không liên quan đến các ví dụ được đưa ra, lỗi này cũng có thể được gây ra nếu hành động điều khiển không được công khai

+0

Cảm ơn bạn rất nhiều vì điều này. Id đã thay đổi suy nghĩ của tôi về phương thức nào được gọi qua ajax và phương thức khác là riêng tư gây ra lỗi này. đã cho tôi stumped cho một tốt 15 phút. Cảm ơn bạn =) – azzy81

+0

Cảm ơn bạn câu trả lời này đã giúp tôi. +1 – Androidbirt

-1

Một trong những lý do cho lỗi này là bạn bỏ lỡ để thêm từ "hành động" sau khi bộ điều khiển của tên phương thức. Nếu bạn nghĩ rằng định tuyến của bạn là OK, hãy kiểm tra tên phương thức.

2

Sau khi tìm kiếm lớn, điều này đã làm việc cho tôi:

1. Tạo 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.- Tạo dịch vụ

# 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.- Tạo mẫu cho nút hành động

{# src/Acme/DemoBundle/Resources/views/CRUD/list__action_publicar.html.twig #} 

<a class="btn btn-sm" href="{{ admin.generateObjectUrl('publicar', object) }}">Publicar</a> 

4. tuyến đường Configure

// 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.- Xóa bộ nhớ đệm

Hy vọng nó giúp

0

Không phải là trường hợp ở đây.Nhưng có một vấn đề khác có liên quan:

Nếu bạn quên hậu tố 'Hành động' sẽ hoạt động. Nhưng khi bạn nhận ra rằng bạn quên hậu tố và sau đó thêm nó ... bất ngờ! Lỗi tương tự như OP.

Vấn đề ở đây là về bộ nhớ đệm

Symfony tạo ra hai tập tin cho các url bộ nhớ đệm:

  • AppDevUrlGenerator.php
  • AppDevUrlMatcher.php

Nếu bạn thay đổi tên hành động của bạn (tức là thêm hậu tố 'Hành động') thì thông tin bộ nhớ cache đó đã lỗi thời.

Giải pháp

php app/console cache:clear 
0

Tương tự như các câu trả lời được chấp nhận, nếu điều khiển của bạn được định nghĩa như một dịch vụ, ví dụ (Trong YAML):

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

Và tuyến đường của bạn sử dụng dịch vụ điều khiển này:

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

Sau đó, nó là cần thiết để đặt tên cho phương pháp hành động đầy đủ bao gồm Action hậu tố, nếu không bạn sẽ nhận được " điều khiển ... không phải là lỗi "có thể gọi được".