2017-09-08 1 views
0

Je tente d'injecter un service de stockage jeton via un laissez-passer du compilateur conçu pour remplacer l'un des services du FOSRestBundle:Comment injecter services partagés de passe du compilateur dans Symfony

<?php 

namespace App\Compiler; 

use App\Event\Listener\RestParamConverter; 
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 

class RestParamConverterOverride implements CompilerPassInterface 
{ 
    /** 
    * You can modify the container here before it is dumped to PHP code. 
    * 
    * @param ContainerBuilder $container 
    */ 
    public function process(ContainerBuilder $container) 
    { 
     $definition = $container->getDefinition('fos_rest.converter.request_body'); 
     $definition->setClass(RestParamConverter::class); 
     $definition->addArgument($container->getDefinition('security.token_storage')); 
    } 
} 

Pour une raison quelconque, même si le système de sécurité définit correctement le jeton dans le TokenStorage, dans mon service personnalisé lorsque j'accède au TokenStorage, $tokenStorage->getToken() semble retourner null. J'ai débogué le code et à coup sûr l'authentification est en cours d'exécution avant que j'essaie de récupérer la valeur.

J'ai testé avec d'autres services et je vois le comportement que tout ce que j'injecte avec $definition->addArgument($container->getDefinition(SERVICE_HERE));. C'est très étrange mais dans les passes du compilateur il semble créer une nouvelle instance de ce service plutôt que d'utiliser le service partagé.

Dans d'autres parties, l'injection de service fonctionne correctement - mais pas dans ces passes de compilation. Quelqu'un peut-il faire la lumière sur pourquoi cela pourrait être?

+0

Vous pouvez consulter le récipient généré sous le répertoire cache pour voir ce qui se passe. Cela confirmera au moins (ou peut-être niera) votre suspicion sur les services partagés. – Cerad

+0

@Cerad: Oui, il semble que ce soit «nouveau» plutôt que d'utiliser le service partagé. – Ryall

+0

Je n'ai pas beaucoup fait avec les passes et en modifiant de façon dynamique les définitions de service. Mais comme un tir dans le noir avez-vous essayé -> addArgument (nouvelle référence ('service_name')) – Cerad

Répondre