Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Comme dans l'excellent tuto Symfony2 de Benjamin, je souhaite faire un listener afin de verifier si l'utilisateur est identifié au moment où il valide un panier et l'inviter a le faire si ce n'est pas le cas. Par contre, je travail moi sur Symfony3.

    services.yml :

        class: Activitalia\ActivitaliaBundle\EventListener\RedirectionListener
        arguments: [@service_container,@session]
        tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

        RedirectionListener.php

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\Session\Session;

class RedirectionListener
{
    public function __construct(ContainerInterface $container, Sesssion $session) {
        die(var_dump($session));
        $this->session = $session;
        $this->router = $container->get('router');
        $this->securityContext = $container->get('security.context');
    }

    public function onKernelRequest(GetResponseEvent $event) {
    etc.        

Ce que je veux

Dans les services, je tente de passer les paramètres service_container et session à ma fonction RedirectionListener
Dans ma methode, je souhaite les recuperer dans un constructeur puis les traiter.

Ce que j'obtiens

Une belle erreur pour m'expliquer que mon code YAML n'est pas bon :
FileLoaderLoadException
The file "Bundle/Resources/config/services.yml" does not contain valid YAML in Bundle/Resources/config/services.yml (which is being imported from "app/config\config.yml").

Si je passe mes arguments comme cela : " arguments: [service_container,session] ", j'obtiens une erreurs sur le constructeur (les variables passées ne sont pas bonnes) :

ContextErrorException
Catchable Fatal Error: Argument 1 passed to Bundle\EventListener\RedirectionListener::__construct() must implement interface Symfony\Component\DependencyInjection\ContainerInterface, string given, called in \var\cache\dev\appDevDebugProjectContainer.php on line 471 and defined

Pouvez-vous m'aiguiller ?

4 réponses


Salut !
Les arguments doivent être passés entre apostrophes depuis Symfony 3 !

services.yml

services:
    event_listener:    
        class: Activitalia\ActivitaliaBundle\EventListener\RedirectionListener
        arguments: ['@service_container', '@session']
        tags:
            - { name: 'kernel.event_listener', event: 'kernel.request', method: 'onKernelRequest' }

Également, évite d'injecter le container dans les arguments, il est préférable d'injecter seulement les services nécessaires.

Cordialement, Lyrod

Merci beaucoup Lyrod.
Pour ta remarque a propos du container (si je l'ai bien comprise), ne pas se filler à die(var_dump($session)); , il s'agissait juste d'un test pour comprendre où ca disfonctionnait. J'utilise bien le service container par la suite de mon code.
J'en profite egalement pour te demander : où trouve-t-on de la doc qui resume les changement entre symfony 2 et 3 (ca existe ?).

Salut !

Quel version exacte utilises-tu ? Depuis la version 3.3, il existe une meilleure manière de définir ses services complété avec l'autowiring :

https://github.com/symfony/symfony-standard/blob/3.3/app/config/services.yml

Concernant les changements apportés, il existe le blog symfony (https://symfony.com/blog) où tu peux trouver les divers changements apportés aux versions mais également des instructions pour mettre à jour sa version (http://symfony.com/doc/3.3/setup/upgrade_major.html)

Concernant les changements les plus critiques, tu peux chercher les diverses deprecations et modifications à faire.

Dans un futur proche, l'utilisation de $this->get($id); sera supprimé et il faudra utiliser des services privés injectés soit dans le constructeur, soit en service arguments (Symfony >= 3.3)

J'espère que ça t'aura aidé.

Lyrod.

Oui, ça aide.

Merci beaucoup.