3.4.6 - Listener avec paramètre qui ne s'injecte pas
Bonjour à tous,
Je rencontre un problème lorsque les utilisateurs cherchent à réinitialiser le mot de passe.
J'utilise FOSUserBundle pour gérer les utilisateurs et lorsque le mot de passe est redéfini, j'ai eu besoin de réécrire le listener lié à cet évènement. Ce dernier est défini avec des dépendance comme suit :
Code:
1 2 3 4 5 6
|
user.password.change:
class: AppBundle\Listeners\PasswordResettingListener
arguments: ['@router', '@listener1', '@listener2']
tags:
- { name: kernel.event_subscriber } |
Le listener ne pose pas de problèmes particulier si ce n'est au niveau de l'injection des dépendances où la toute dernière (la plus importante), celle qui donne les identifiants d'accès aux APIs n'est pas injecté.
Le @listener1 ne dépend que de lui même c'est sur le @listerner2
Code:
1 2 3 4 5 6 7 8 9 10
|
api.rzp:
class: AppBundle\HTTPRequest\Rezopouce
arguments: ["@request_stack", '@api.token.listener']
api.token.listener:
class: AppBundle\Listeners\ApiTokenListener
arguments: ['@doctrine.orm.entity_manager', '@security.token_storage', '%api%']
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } |
Les services sont bien injectés récurssivement. c'est le tableau '%API%', issu des paramètres (YALM) n'est pas injecté dans ce cas de figure. Par ailleurs, lorsque l'appel du listener se fait lors du traitement des évènements 'kernel.request' le paramètre est alors correctement injecté.
Les logs de la page montrent que seules 2 dépendances sont injectées mais qu'il en manque une au constructeur du service :
Code:
1 2
|
return $this->services['AppBundle\Listeners\PasswordResettingListener'] = new \AppBundle\Listeners\PasswordResettingListener(${($_ = isset($this->services['router']) ? $this->services['router'] : $this->getRouterService()) && false ?: '_'}, new \AppBundle\HTTPRequest\Cityway($a), new \AppBundle\HTTPRequest\Listener2(${($_ = isset($this->services['request_stack']) ? $this->services['request_stack'] : $this->services['request_stack'] = new \Symfony\Component\HttpFoundation\RequestStack()) && false ?: '_'}, new \AppBundle\Listeners\ApiTokenListener($a, ${($_ = isset($this->services['security.token_storage']) ? $this->services['security.token_storage'] : $this->services['security.token_storage'] = new \Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage()) && false ?: '_'}))); |
Le code partiel du controller en question :
Code:
1 2
|
public function __construct(EntityManagerInterface $em, TokenStorageInterface $security_token_storage, $api = null) { ... |
L'argument $api n'étant pas injecté, il prend automatiquement null pour valeur.
Je tatonne depuis plusieurs heures sans constater d'avancés.
Vous remerciant par avance pour le temps que vous accorderez à mon problème.