Disparo de Eventos mais Simples no Symfony 4.3

Andréia Bohner
Mar 26 · 2 min read

No Symfony 3.3, a classe para serviços nomeados foi tornada opcional e foi iniciada a recomendação do uso do nome de classe totalmente qualificado (FQCN) como ID de serviço. Isso torna a configuração mais intuitiva e ajuda a evitar ter que pensar em strings arbitrárias para nomear serviços.

Seguindo a mesma ideia, no Symfony 4.3, a assinatura do método EventDispatcherInterface::dispatch() foi alterada:

// ...
$order = new Order();
$newOrderEvent = new OrderPlacedEvent($order);

// Before
$dispatcher->dispatch(OrderEvents::NEW_ORDER, $newOrderEvent);

// After
$dispatcher->dispatch($newOrderEvent, OrderEvents::NEW_ORDER);

Embora essa alteração pareça pequena, ela ajuda a simplificar o restante do código da aplicação. Para começar, você pode se inscrever em eventos usando o FQCN do evento:

class StoreSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
// Before
return [
OrderEvents::NEW_ORDER => 'onStoreOrder',
];

// After
return [
OrderPlacedEvent::class => 'onStoreOrder',
];
}

// ...
}

Além disso, o nome do evento agora é opcional no método dispatch(), então você pode passar apenas o objeto do evento:

// Before
$dispatcher->dispatch(OrderEvents::NEW_ORDER, $newOrderEvent);

// After
$dispatcher->dispatch($newOrderEvent);

Em resumo, a nova assinatura dispatch() permite que você desenvolva código baseado em classes PHP puras em vez de inventar strings arbitrárias para nomear os eventos.

Classes de Eventos do HttpKernel Atualizadas

Além da mudança anterior, também foram atualizadas as classes dos eventos que o Symfony passa para seus próprios eventos. Os novos nomes são muito mais intuitivos e concisos:

  • Renomeado FilterControllerArgumentsEvent para ControllerArgumentsEvent

Suportando Ambos os Dispatchers

Bundles e pacotes que desejam fornecer compatibilidade com versões anteriores e/ou posteriores dos novos e antigos métodos dispatch() podem usar a nova classe LegacyEventDispatcherProxy:

use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy;

class SomeService
{
public function __construct(EventDispatcherInterface $dispatcher)
{
$this->dispatcher = LegacyEventDispatcherProxy::decorate($dispatcher);
}

public function someMethod()
{
// ...

// use the new way of dispatching events (with or without the event name)
// even if the provided dispatcher still implements the legacy way
$this->dispatcher->dispatch($newOrderEvent);
$this->dispatcher->dispatch($newOrderEvent, OrderEvents::NEW_ORDER);
}
}

Tradução de: New in Symfony 4.3: Simpler event dispatching

Andréia Bohner

Written by

Curious Mind