2013-07-30 13 views
18

pracuję nad Symfony 2.3 i ogłosił nowy trasę i nowy kontroler, ale gdy zgłoszę ten kontroler z przeglądarki uzyskać ten błąd :Rozwiązywanie problemów „Sterownik dla URI nie jest wymagalne” Błąd

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

to moja prosta trasa konfiguracja:

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

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

A to moja bardzo prosty kontroler:

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

Co jest nie tak?

Odpowiedz

64

logiczna nazwa UserBundle:Default:show dotyczy UserBunde\Controller\DefaultController::showAction masz metodę zwaną showUserAction.

Zmień nazwę metody na showAction lub zmień nazwę logiczną na UserBundle:Default:showUser.

+0

Nazwa sprzedawcy, którego celowo pominąłem. W każdym razie teraz działa. Dziękuję bardzo. Dzisiaj była ciężka praca. –

+9

+1 i facepalm, zapomniałem część Akcji mojego imienia i nazwiska. – HMR

2

Definiujesz swoją funkcję kontrolera jako showUserAction, podczas gdy w definicji mówisz, że jest to show[Action].

Albo zmienić konfigurację trasy

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

lub zmienić podpis kontrolera

public function showAction($id) 
{ 

Zobacz, czy to pomaga

15

Choć nie istotne podanym przykładzie, błąd ten może być również spowodowane jeśli akcja kontroler nie jest publiczna

+0

Dziękuję bardzo za to. Id zmienił moje zdanie na temat metody, która była wywoływana przez ajax, a druga metoda była prywatna, co spowodowało ten błąd. kazał mi wpaść na dobre 15 minut. Dziękuję =) – azzy81

+0

Dziękuję, że ta odpowiedź pomogła mi. +1 – Androidbirt

-1

Jedną z przyczyn tego błędu jest to, że brakowało, aby dodać słowo „akcja” po kontrolera nazwa metody. Jeśli uważasz, że Twój routing jest w porządku, sprawdź nazwę metody.

2

Po wielkim poszukiwaniu, ten pracował dla mnie:

1.- Tworzenie 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.- Tworzenie usługę

# 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.- utworzyć szablon dla przycisk czynności

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

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

4.- Konfiguracja trasy

// 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.- Wyczyść cache

Nadzieja pomaga

0

Nie w tym przypadku.Ale jest jeszcze jeden powiązany problem:

Jeśli zapomnisz sufiksu "Akcja", wszystko będzie działać. Ale kiedy zdałeś sobie sprawę, że zapomniałeś przyrostka, a potem go dodałeś ... niespodzianka! Ten sam błąd co OP.

Problemem tutaj jest o buforowanie

Symfony tworzy dwa pliki do buforowania adresów URL:

  • AppDevUrlGenerator.php
  • AppDevUrlMatcher.php

Jeśli zmienisz nazwę działania (tj. dodanie sufiksu "Akcja"), to informacja o pamięci podręcznej jest przestarzała.

Rozwiązanie

php app/console cache:clear 
0

podobne do przyjętego odpowiedź, jeśli kontroler jest zdefiniowana jako usługa, na przykład (W YAML):

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

A trasa korzysta z tej usługi Kontroler:

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

Wtedy trzeba by wymienić metodę działania w pełnej tym Action przyrostkiem, inaczej dostaniesz " kontroler ... nie można wywołać "błędu.

Powiązane problemy