Events
Uso Básico
As instalações de eventos do Laravel fornecem uma simples implementação de observer, o que lhe permite inscrever e escutar eventos em sua aplicação. Classes evento são tipicamente armazenada no diretório app/Events
, enquanto seus manipuladores são armazenados em app/Handlers/Events
.
Você pode gerar uma nova classe de evento usando a ferramenta CLI Artisan:
php artisan make:event PodcastWasPurchased
Subescrevendo Para um Evento
O EventServiceProvider
incluído com a sua aplicação Laravel fornece um lugar conveniente para registrar todos os manipuladores de evento. A propriedade listen
contém um array de todos os eventos (chaves) e seus manipuladores (valores). É claro que, você pode adicionar quantos eventos forem necessários para sua aplicação. Por exemplo, vamos adicionar o nosso PodcastWasPurchased
:
/**
* The event handler mappings for the application.
*
* @var array
*/
protected $listen = [
'App\Events\PodcastWasPurchased' => [
'App\Handlers\Events\EmailPurchaseConfirmation',
],
];
Para gerar um manipulador para o evento, use o comando CLI Artisan handler:event
:
php artisan handler:event EmailPurchaseConfirmation --event=PodcastWasPurchased
É claro que, executando manualmente os comandos make:event
e handler:event
cada vez que você precisar de um manipulado ou evento é complicado. Em vez disso, simplesmente adicione manipuladores e eventos para o seu EventServiceProvider
e use o comando event:generate
. Este comando irá gerar quaisquer eventos ou manipuladores que estão listados no seu EventServiceProvider
:
php artisan event:generate
Disparando um Evento
Agora nos estamos prontos para disparar nossos eventos usando a fachada Event
:
$response = Event::fire(new PodcastWasPurchased($podcast));
O método fire
retorna um array de respostas que você pode usar para controlar o que acontece depois na sua aplicação.
Você pode também usar o event
"helper" para disparar um evento:
event(new PodcastWasPurchased($podcast));
Closure Listeners (Escutadores Closure)
Você pode até ouvir eventos sem criar classes de manipuladores separadas a final de conta. Por exemplo, no método boot
do seu EventServiceProvider`, você pode fazer o seguinte:
Event::listen('App\Events\PodcastWasPurchased', function($event)
{
// Handle the event...
});
Parando a Propagação De um Evento
Algumas vezes, você pode desejar parar a propagação de um eventos para outrs escutadores. Você pode fazer isto retornando false
do seu manipulador:
Event::listen('App\Events\PodcastWasPurchased', function($event)
{
// Handle the event...
return false;
});
Manipuladores de Eventos em Fila.
Precisando enfileirar um maipulador de eventos ? Isto não pode ser mais fácil. Quando estiver gerando um manipulador, simplesmente use a flag --queued
:
php artisan handler:event SendPurchaseConfirmation --event=PodcastWasPurchased --queued
Isto irá gerar a classe manipuladora que implementa a interface Illuminate\Contracts\Queue\ShouldBeQueued
. É isto! Agora quando este manipulador é chamado para um evento, isto irá ser enfileirado automaticamente pelo dispachador de eventos.
Se nenhuma exceção é lançada quando o manipulador é executado pela fila, o trabalho enfileirador será exluído automaticamente depois que isto tiver sido processado. Se você precisar acessar manualmente os métodos delete
e release
do trabalho enfileirado, você pode fazê-lo. A trait Illuminate\Queue\InteractsWithQueue
, que é incluído por padrão nos manipuladores em fila, dá a você acesso para estes métdodos:
public function handle(PodcastWasPurchased $event)
{
if (true)
{
$this->release(30);
}
}
Se você tem um manipulador existente que você gostaria de converter para um manipulador em fila, simplesmente adicione a interface ShouldBeQueued
para a classe manualmente.
Assinantes de eventos
Definindo um Assinante de evento
Assinantes de eventos são classes que podem subescrever para múltiplos eventos de dentro da própria classe. Assinantes devem definir o método subscribe
, que irá ser passado para uma instância de despachador de eventos:
class UserEventHandler {
/**
* Handle user login events.
*/
public function onUserLogin($event)
{
//
}
/**
* Handle user logout events.
*/
public function onUserLogout($event)
{
//
}
/**
* Register the listeners for the subscriber.
*
* @param Illuminate\Events\Dispatcher $events
* @return array
*/
public function subscribe($events)
{
$events->listen('App\Events\UserLoggedIn', 'UserEventHandler@onUserLogin');
$events->listen('App\Events\UserLoggedOut', 'UserEventHandler@onUserLogout');
}
}
Registrando um Assinante de Evento
Uma vez que o assinante tenha sido definido, isto pode ser registrado com a classe Event
.
$subscriber = new UserEventHandler;
Event::subscribe($subscriber);
Você pode também usar o container de serviço para resolver seu assinante. Para fazê-lo, simplesmente passe o nome do seu assinante ppara o método subscribe
:
Event::subscribe('UserEventHandler');