2016-05-09 8 views
0

ich benutzerdefinierte Tags auf meine Dienste nutzen wollen, so folgte ich den Anweisungen in der Dokumentation: http://symfony.com/doc/2.8/components/dependency_injection/tags.htmlDefinition: addMethodCall funktioniert, aber Methoden werden aufgerufen, nie

ich eine RulesHydrator Klasse:

<?php 

namespace TestBundle\Thruway; 

class RulesHydrator 
{ 
    private $container; 
    private $manualChecks = []; 

    public function __construct($container) 
    { 
     $this->container = $container; 
    } 

    public function addManualCheck($service, $rule, $method) 
    { 
     echo 'addManualCheck invoked!'.PHP_EOL; 
     exit; 
     $this->manualChecks[$rule] = $service; 
    } 
} 

Hier Pass ist der Compiler:

<?php 

namespace TestBundle\Thruway; 

use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; 
use Symfony\Component\DependencyInjection\Reference; 

class ThruwayCompilerPass implements CompilerPassInterface 
{ 
    public function process(ContainerBuilder $container) 
    { 
     if (!$container->has('thruway.rules_hydrator')) { 
      return; 
     } 

     $definition = $container->findDefinition('thruway.rules_hydrator'); 

     foreach ($container->findTaggedServiceIds('thruway.manual_check') as $id => $tags) { 
      foreach ($tags as $attributes) { 
       $definition->addMethodCall('addManualCheck', [new Reference($id), $attributes['rule'], $attributes['method']]); 
      } 
     } 
    } 
} 

Hier ist die Klasse mein Bundle:

<?php 

namespace TestBundle; 

use Symfony\Component\HttpKernel\Bundle\Bundle; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use TestBundle\Thruway\ThruwayCompilerPass; 

class TestBundle extends Bundle 
{ 
    public function build(ContainerBuilder $container) 
    { 
     parent::build($container); 

     $container->addCompilerPass(new ThruwayCompilerPass()); 
    } 
} 

Meine services.yml Datei sieht wie folgt aus:

services: 
    thruway.rules_hydrator: 
     class: TestBundle\Thruway\RulesHydrator 

    thruway.customer_checker: 
     class: TestBundle\Thruway\MyChecker 
     tags: 
      - { name: thruway.manual_check, rule: some.rule1, method: someMethod1 } 
      - { name: thruway.manual_check, rule: some.rule2, method: someMethod2 } 

Der Prozess Methode wird aufgerufen, und die verschiedenen Anrufe an addMethodCall auf meinem Definition Objekt funktionieren (die Eigenschaft „ruft“ von die Definition ist korrekt ausgefüllt). Das Problem ist, dass die Aufrufe an meine Methode addManualCheck nie auftreten. Irgendeine Idee warum?

Antwort

0

Der Fall könnte sein, dass Sie den Dienst nicht instanziiert haben. Standardmäßig von dem, was ich erinnere, sind die Dienste faul geladen, und bis Sie tatsächlich eine aus dem Container abrufen, oder es in einen anderen Dienst injiziert wird, wird es nicht initialisiert.

Können Sie Ihre appProdProjectContainer.php in app/cache/prod für die "TestBundle \ Thruway \ MyChecker" und post zurück, wie es verwendet wird?

Versuchen Sie auch eine schnelle Überprüfung, indem Sie den thruway.customer_checker aus dem Container abrufen.

könnte ein schneller Befehl wie diese

helfen
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; 
use Symfony\Component\Console\Input\InputInterface; 
use Symfony\Component\Console\Output\OutputInterface; 

class TestCommand extends ContainerAwareCommand 
{ 
    protected function configure() 
    { 
     $this->setName('service:test')->setDescription('Test service functionalities'); 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $service = $this->getContainer()->get('thruway.customer_checker'); 
    } 
} 
Verwandte Themen