2013-09-04 14 views
5

Sto provando ad agganciare gli eventi della console symfony con l'edizione standard di symfony (2.3), ma semplicemente non funzionerà.Come posso ascoltare gli eventi della console in symfony?

ho creato un ascoltatore in base alla loro example e seguire la 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())); 
    } 
} 

e qualcuno sulla mailing list mi ha detto di registrarlo come evento nel contenitore dei servizi. Così ho fatto questo:

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

Ma ovviamente l'etichettatura non è corretta e non riesco a trovare i nomi corretti per quello. Come potrei farlo?

+0

Stai utilizzando 'php app/console' o un'applicazione personalizzata? – Touki

+0

Sto usando l'edizione standard di Symfony e voglio aggiungere un evento prima che venga eseguito un comando 'app/console'. Ho già chiesto al gruppo di google di symfony e qualcuno ha detto che devo configurarlo usando un servizio (come ho provato sopra). – acme

risposta

1

Quindi, ho finalmente capito. Il codice sopra riportato nel post originale è completamente funzionante, ma ho definito my services.yml all'interno del mio bundle non nella configurazione dell'applicazione app/config.yml. Ciò significa che la configurazione non è mai stata caricata. Ho dovuto importare la configurazione tramite le estensioni del contenitore:

# 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'); 
    } 
} 

e

# 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; 
    } 
} 

anche se credo che si può anche lasciare fuori la parte $configuration = new Configuration(); e la classe Configuration.

Problemi correlati