2013-09-04 13 views
5

Próbuję podłączyć się do zdarzeń konsoli symfony z standardową edycją symfony (2.3), ale to po prostu nie zadziała.Jak mogę słuchać zdarzeń konsoli w symfony?

stworzyłem słuchacza według ich example i postępuj guides on event registration:

namespace Acme\DemoBundle\EventListener; 

use Symfony\Component\Console\Event\ConsoleCommandEvent; 
use Symfony\Component\Console\ConsoleEvents; 

class AcmeCommandListener 
{ 
    public function onConsoleCommand(ConsoleCommandEvent $event) { 
     // get the output instance 
     $output = $event->getOutput(); 

     // get the command to be executed 
     $command = $event->getCommand(); 

     // write something about the command 
     $output->writeln(sprintf('Before running command <info>%s</info>', $command->getName())); 
    } 
} 

i ktoś na liście mailingowej mi go zarejestrować jako wydarzenie w pojemniku usług. Zrobiłem to:

services: 
    kernel.listener.command_dispatch: 
     class: Acme\DemoBundle\EventListener\AcmeCommandListener 
     tags: 
      - { name: kernel.event_listener, event: console.command } 

Ale oczywiście oznaczanie jest nieprawidłowe i nie mogę znaleźć poprawnych nazw. Jak to zrobić?

+0

Czy używasz 'php app/console' lub niestandardowej aplikacji? – Touki

+0

Używam standardowej wersji Symfony i chcę dodać zdarzenie uruchamiane przed wykonaniem polecenia 'app/console'. Pytałem już w grupie google z symfony i ktoś powiedział, że muszę go skonfigurować za pomocą usługi (jak próbowałem powyżej). – acme

Odpowiedz

1

Tak, w końcu to dostałem. Powyższy kod w oryginalnym poście w pełni działa, ale zdefiniowałem mój services.yml w moim pakiecie, a nie w konfiguracji aplikacji app/config.yml. Oznacza to, że konfiguracja nigdy nie została załadowana. Musiałem zaimportować konfigurację poprzez rozszerzeń kontenerowych:

# Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php 
namespace Acme\DemoBundle\DependencyInjection; 

use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\Config\FileLocator; 
use Symfony\Component\HttpKernel\DependencyInjection\Extension; 
use Symfony\Component\DependencyInjection\Loader; 

class AcmeDemoExtension extends Extension 
{ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     $configuration = new Configuration(); 
     $config = $this->processConfiguration($configuration, $configs); 

     $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 
     $loader->load('services.yml'); 
    } 
} 

i

# Acme/DemoBundle/DependencyInjection/Configuration.php 
namespace Acme\DemoBundle\DependencyInjection; 

use Symfony\Component\Config\Definition\Builder\TreeBuilder; 
use Symfony\Component\Config\Definition\ConfigurationInterface; 

class Configuration implements ConfigurationInterface 
{ 
    public function getConfigTreeBuilder() 
    { 
     $treeBuilder = new TreeBuilder(); 
     $rootNode = $treeBuilder->root('headwork_legacy'); 
     return $treeBuilder; 
    } 
} 

Choć myślę, że można nawet pominąć $configuration = new Configuration(); część i klasę Configuration.

Powiązane problemy