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?
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
.
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.
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
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
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".
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:
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