2013-07-30 10 views
18

Ich arbeite an Symfony 2.3 und ich erklärte eine neue Route und neue Controller, aber wenn ich diesen Controller aus dem Browser aufrufen bekomme ich diesen Fehler :Fehlerbehebung „Der Controller für URI ist nicht aufrufbar“ Fehler

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

Das ist meine einfache Route ist Konfiguration:

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

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

Und das ist meine sehr einfache Controller:

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

Was ist falsch?

Antwort

64

Der logische Name UserBundle:Default:show bezieht sich auf UserBunde\Controller\DefaultController::showAction hilft Ihnen, eine Methode showUserAction genannt haben.

Ändern Sie entweder den Methodennamen in showAction oder ändern Sie den logischen Namen in UserBundle:Default:showUser.

+0

Der Name des Verkäufers habe ich absichtlich weggelassen. Wie auch immer, es funktioniert jetzt. Vielen Dank. Heute war ein harter Arbeitstag. –

+9

+1 und facepalm, ich habe den Aktionsteil meines Funktionsnamens vergessen. – HMR

2

Sie definieren Ihre Controller-Funktion als showUserAction, während Sie in der Definition sagen, dass es show[Action] ist.

Entweder Ihre Route Konfiguration des Controllers ändern

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

oder ändern Signatur

public function showAction($id) 
{ 

Sehen Sie, wenn diese

15

Obwohl nicht relevant für das Beispiel gegeben, kann dieser Fehler auch auftreten, wenn die Controller Aktion ist nicht öffentlich

+0

Vielen Dank dafür. Ich änderte meine Meinung darüber, welche Methode über Ajax aufgerufen wurde und die andere Methode war privat, was diesen Fehler verursacht hat. hatte mich für gute 15 Minuten ratlos. Danke =) – azzy81

+0

Danke diese Antwort hat mir geholfen. +1 – Androidbirt

-1

Einer der Gründe für diesen Fehler ist, dass Sie das Wort „Aktion“ nach dem Controller hinzuzufügen verpaßt Methodenname. Wenn Sie der Meinung sind, dass Ihr Routing in Ordnung ist, überprüfen Sie den Methodennamen.

2

Nach großen suchen, ist dies für mich gearbeitet:

1.- CRUDController erstellen

// 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.- Erstellen Sie den Service

# 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.- Erstellen Sie die Vorlage für die Aktionstaste

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

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

4.- Configure Route

// 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.- Cache löschen

Hoffe, dass es hier

0

nicht der Fall hilft.Aber es gibt ein anderes verwandtes Problem:

Wenn Sie das Suffix 'Aktion' vergessen, wird alles funktionieren. Aber wenn du merkst, dass du das Suffix vergisst und dann fügst du es hinzu ... Überraschung! Derselbe Fehler wie das OP.

Das Problem hier ist über Caching

Symfony erstellt zwei Dateien für das Caching von Urls:

  • AppDevUrlGenerator.php
  • AppDevUrlMatcher.php

Wenn Sie Ihren Aktionsnamen ändern (zB Hinzufügen des Suffix 'Aktion', dann ist diese Cache-Information veraltet.

Lösung

php app/console cache:clear 
0

Ähnlich wie die akzeptierte Antwort, wenn Ihr Controller als Service definiert ist, z.B. (In YAML):

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

Und Ihre Route verwendet diesen Controller Dienst:

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

Dann ist es notwendig, die Aktion-Methode in voller einschließlich dem Action Suffix zu nennen, sonst erhalten Sie die " Controller ... ist nicht aufrufbar "Fehler.

Verwandte Themen