O que é o sistema de eventos do Console do Symfony?
O sistema de eventos é uma funcionalidade presente no Console do Symfony que permite adicionar hooks aos comandos, de forma que seja possível executar funcionalidades adicionais antes ou depois do comando ser executado.
Como utilizar o sistema de eventos?
Para utilizar o sistema de eventos, primeiramente é necessário definir um listener, que irá conter as funcionalidades adicionais que serão executadas. Em seguida, é preciso adicionar o listener ao evento desejado, utilizando o método addSubscriber
do objeto Application
.
namespace AppEventListener;
use SymfonyComponentConsoleEventConsoleCommandEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
class MyCommandListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
ConsoleCommandEvent::class => 'onCommand',
];
}
public function onCommand(ConsoleCommandEvent $event)
{
// code to be executed before or after the command
}
}
No exemplo acima, criamos um listener para o evento ConsoleCommandEvent
, que será executado antes ou depois da execução do comando. Para adicionar o listener, basta adicionar a seguinte linha ao método configure
do comando desejado:
$application->add(new MyCommand())->getApplication()->addSubscriber(new MyCommandListener());
Como adicionar mais de um listener?
Para adicionar mais de um listener, basta criar os listeners e adicioná-los ao evento desejado utilizando o método addSubscriber
várias vezes:
$application->add(new MyCommand())
->getApplication()
->addSubscriber(new MyCommandListener())
->addSubscriber(new AnotherCommandListener());
Como passar informações para o listener?
Para passar informações para o listener, é possível adicionar parâmetros ao construtor do listener e passar valores para esses parâmetros ao instanciar o listener.
namespace AppEventListener;
use SymfonyComponentConsoleEventConsoleCommandEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
class MyCommandListener implements EventSubscriberInterface
{
private $param;
public function __construct(string $param)
{
$this->param = $param;
}
public static function getSubscribedEvents()
{
return [
ConsoleCommandEvent::class => 'onCommand',
];
}
public function onCommand(ConsoleCommandEvent $event)
{
// code to be executed before or after the command
echo $this->param;
}
}
$application->add(new MyCommand())->getApplication()->addSubscriber(new MyCommandListener('hello world'));
No exemplo acima, adicionamos um parâmetro ao construtor do listener e passamos o valor ‘hello world’ ao instanciá-lo.
Como remover um listener?
Para remover um listener, é preciso armazenar a lista de listeners adicionados ao evento na variável $listeners
e remover o listener desejado com o método removeListener
:
$application = new Application();
$command = new MyCommand();
$listener1 = new MyCommandListener();
$listener2 = new AnotherCommandListener();
$application->add($command)->getApplication()
->addSubscriber($listener1)
->addSubscriber($listener2);
$listeners = $command->getApplication()->getDispatcher()->getListeners(ConsoleCommandEvent::class);
if (false !== $key = array_search([$listener1, 'onCommand'], $listeners, true)) {
$command->getApplication()->getDispatcher()->removeListener(ConsoleCommandEvent::class, [$listener1, 'onCommand']);
}
No exemplo acima, armazenamos a lista de listeners adicionados ao evento em $listeners
e removemos o listener $listener1
utilizando o método removeListener
.
Conclusão
O sistema de eventos do Console do Symfony é uma funcionalidade extremamente útil para adicionar funcionalidades adicionais aos comandos, de forma fácil e organizada. Com ele, é possível adicionar hooks aos comandos, passar informações para os listeners e remover listeners, permitindo uma maior flexibilidade e customização dos comandos.