(16) 981791110 contato@policast.studio

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.