web-dev-qa-db-fra.com

Dépannage de l'erreur "Le contrôleur pour l'URI n'est pas appelable"

Je travaille sur Symfony 2.3 et j'ai déclaré un nouveau route et un nouveau contrôleur, mais lorsque j'appelle ce contrôleur à partir du navigateur, l'erreur suivante apparaît:

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

Voici ma configuration simple route:

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

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

Et voici mon très simple contrôleur:

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

Qu'est-ce qui ne va pas?

23
Angelo Giuffredi

Le nom logique UserBundle:Default:show fait référence à UserBunde\Controller\DefaultController::showAction vous avez une méthode appelée showUserAction.

Changez le nom de la méthode en showAction ou changez le nom logique en UserBundle:Default:showUser.

68
Wouter J

Bien que cela ne soit pas pertinent pour l'exemple donné, cette erreur peut également être provoquée si l'action de l'automate n'est pas publique.

16
Ben

Vous définissez votre fonction de contrôleur comme showUserAction tandis que dans la définition, vous dites qu'il s'agit de show[Action].

Soit changer la configuration de votre itinéraire

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

ou changer la signature de votre contrôleur

public function showAction($id)
{

Voir si cela aide

3
saamorim

Après une grande recherche, cela a fonctionné pour moi:

1.- Créer 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.- Créer le 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.- Créer le modèle pour le bouton d'action

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

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

4.- Configurer la 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.- Vider le cache

J'espère que ça aide

2
Darkland

Semblable à la réponse acceptée, si votre contrôleur est défini comme un service, par ex. (en YAML):

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

Et votre route utilise ce service de contrôleur:

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

Ensuite, il est nécessaire de nommer la méthode d’action en entier y compris le suffixe Action, sinon vous obtiendrez l’erreur "controller ... is callable".

0
ironchicken

Pas le cas ici. Mais il y a un autre problème connexe:

Si vous oubliez le suffixe "Action", tout fonctionnera. Mais quand vous vous êtes rendu compte que vous avez oublié le suffixe et que vous l’ajoutez ensuite… surprise! Même erreur que l'OP.

Le problème ici concerne la mise en cache

Symfony crée deux fichiers pour la mise en cache des URL:

  • AppDevUrlGenerator.php
  • AppDevUrlMatcher.php

Si vous modifiez le nom de votre action (c'est-à-dire en ajoutant le suffixe "Action"), ces informations de cache sont obsolètes.

Solution

php app/console cache:clear
0
itrascastro