[Symfony-2]tester empty(entity) via un listener
Bonjour,
Je ne m'y prends peut-être pas comme il le faut, mais je souhaite faire un test sur l'existance d'enregistrement dans une entité avant l'action des Controllers.
J'ai donc pensé au Listener, mais je ne vois pas comment faire l'appel au Repository.
Voici le code de mon Listener:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?php
namespace Glsr\GestockBundle\Listener;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
class GlsrControllerListener
{
public function onKernelController(FilterControllerEvent $event)
{
// nous récupérons l'objet controller depuis l'évènement reçu
$controller = $event->getController();
var_dump($controller);
// vérifie que l'objet Company n'est pas vide
$etm = $controller->getDoctrine()->getManager();
$repoCompany = $etm->getRepository('GlsrGestockBundle:Company');
$company = $repoCompany->findAll();
if (empty($company)) {
// On définit un message flash
$controller->get('session')->getFlashBag()->add('info', 'Il faut renseigner les informations de la société');
// On redirige vers la page d'ajout d'information de la société
$controller->redirect($controller->generateUrl('glstock_company_add'));
}
... |
Et voici le message d'erreur :
Citation:
FatalErrorException: Error: Call to a member function getDoctrine() on a non-object in G:\wamp\www\Symfony-2\src\Glsr\GestockBundle\Listener\GlsrControllerListener.php line 16
[Résolu] [Symfony-2]tester empty(entity) via un listener
J'ai trouvé ma solution !!!
A force de tester, je me rends compte qu'écouter le Controller n'est pas la meilleure solution. Je me suis penché sur la requête, elle-même. Pour bloquer la redirection, je teste la route de la requête, et si elle corresponds à la route que je souhaite rediriger l'utilisateur, je sors de la fonction onKernel. Et pour la réponse (function onKernelResponse), vu que la redirection ($this->redirect) est nulle, pas d'instruction supplémentaire...
Voici mon code final.
Pour le service :
Code:
1 2 3 4 5 6
| kernel.listener.glsr_request:
class: Glsr\GestockBundle\Listener\GlsrRequestListener
arguments: [ @doctrine.orm.entity_manager, @service_container, @router ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
- { name: kernel.event_listener, event: kernel.response, method: onKernelResponse } |
Et pour le listener:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| <?php
namespace Glsr\GestockBundle\Listener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Doctrine\ORM\EntityManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\HttpFoundation\RedirectResponse;
class GlsrRequestListener
{
private $etm;
private $container;
protected $router;
protected $redirect = null;
public function __construct(EntityManager $etm, ContainerInterface $container, Router $router)
{
$this->etm = $etm;
$this->container = $container;
$this->router = $router;
}
public function onKernelRequest(GetResponseEvent $event)
{
// Si la route en cours est celle que l'on veut attribuer,
// on sort de la fonction
if ($event->getRequest()->attributes->get('_route') === 'glstock_company_add') {
return;
}
// vérifie que l'objet Company n'est pas vide
$repoCompany = $this->etm->getRepository('GlsrGestockBundle:Company');
$company = $repoCompany->findAll();
if (empty($company)) {
// On définit un message flash
$this->container->get('session')->getFlashBag()->add('info', 'Il faut renseigner les informations de la société');
// On crée la route vers la page d'ajout d'information de la société
$this->redirect = 'glstock_company_add';
}
}
public function onKernelResponse(FilterResponseEvent $event)
{
// On redirige vers la page d'ajout d'information de la société
if (NULL !== $this->redirect) {
$url = $this->router->generate($this->redirect);
$event->setResponse(new RedirectResponse($url));
}
}
} |
Merci pour ta participation VynkaVynka