Blog EspecializaTi
Carlos Ferreira Por: Carlos Ferreira Comentar

Aprenda como Trabalhar com Eventos no Laravel

Aprenda como Trabalhar com Eventos no Laravel

Um tema bastante interessante e ao mesmo tempo muito útil do Laravel são os eventos. Como o próprio nome sugere evento é uma ação que pode ser disparada automaticamente, e a partir deste evento você pode executar diversas outras tarefas.

Um exemplo prático, imagine que temos uma página de um post (tutorial) e temos uma interação com o usuário onde ele pode comentar esse post, ao comentar o post nos podemos disparar um evento no Laravel informando ao autor que o post X foi comentado, e esse evento pode estar ligado a alguns Listeners (Ouvintes) que tomam ações automáticas, como por exemplo: enviar um e-mail para o dono do post, enviar um SMS para Admin e/ou registrar o log no sistema.

O exemplo do paragrafo acima poderia ser realizado manualmente, mas com Events do Laravel fica mais fácil, porque fica organizado, e também possibilita o reaproveitamento destas funcionalidades em outros locais;

Um evento pode conter diversos Listeners, e um mesmo Listener pode estar ligado a diversos Events. Os eventos no Laravel são registrados em app/Events/ e os Listeners (Ouvintes) ficam em app/Listeners/

 
 

Criar Events no Laravel

Podemos e devemos abusar do artisan para criar os Events e Listeners no Laravel.

Para criar um novo Event rode o comando do artisan php artisan make:event NameEvent, neste caso vamos criar um Event para quando um post é comentado:

php artisan make:event CommentedPost

O arquivo será criado em app/Events/CommentedPost.php

 

Para criar os Listeners (Ouvintes) basta rodar o comando:

php artisan make:listener SendMailCommentedPost --event=CommentedPost

O prefixo --event precisa receber o CommentedPost, porque já cria o Listener vinculado ao Event CommentedPost. Este arquivo ficará salvo em app/Listeners/SendMailCommentedPost.php

 

Outro formato de criar os Events + Listeners é rodar o comando:

php artisan event:generate

Esse comando vai criar automaticamente todos os arquivos de Events e Listeners registrado em app/Providers/EventServiceProvider.php no atributo :

protected $listen = [
    'App\Events\Event' => [
        'App\Listeners\EventListener',
    ],
];

Neste exemplo vai gerar dois arquivos, o event que vai ficar salvo em app/events/Event.php e o Listener que vai ficar salvo em app/listeners/EventListener.php

 
 

Registrar Events no Laravel

Uma vez que os arquivos foram criado o próximo passo é vincular, ou seja, registrar o Event e definir qual/quais Listeners estarão vinculados com o mesmo. Em nosso exemplo vamos vincular o Listener SendMailCommentedPost ao event CommentedPost.

Para registrar basta adicionar no atributo $listen no array, os Events e os Listeners do event. Exemplo:

protected $listen = [
    \App\Events\CommentedPost::class => [
        \App\Listeners\SendMailCommentedPost::class,
    ],
];

Neste exemplo vinculamos o Listener SendMailCommentedPost ao Event CommentedPost, neste caso sempre que disparar o Event CommentedPost automaticamente vai disparar o Listener SendMailCommentedPost.

NOTA: Observe que o atributo $listen recebe um array, isso significa que podemos registrar N eventos. E o Event também receber um array, portanto para um mesmo evento podemos registrar N Listeners.

 
 

Configurar Events no Laravel

O próximo passo é configurar o Event, ou seja, definir o que vai receber no construtor e etc. Neste caso vamos receber no construtor do Event CommentedPost um objeto do comentário, veja:

namespace App\Events;

use App\Models\Comment;
use Illuminate\Queue\SerializesModels;

class CommentedPost
{
    use SerializesModels;

    public $comment;

    /**
     * Create a new event instance.
     *
     * @param  \App\Models\Comment  $comment
     * @return void
     */
    public function __construct(Comment $comment)
    {
        $this->comment = $comment;
    }
}

Neste exemplo ao usar o Event CommentedPost precisa passar obrigatoriamente no construtor um objeto do Model Comment, que é o próprio comentário em si.

NOTA: Observe que o atributo $comment ficou como público, porque vamos acessar diretamente essa propriedade nos Listeners. Mas, se preferir deixar como privado e criar um método que retorna este valor, também pode, veja o exemplo:

namespace App\Events;

use App\Models\Comment;
use Illuminate\Queue\SerializesModels;

class CommentedPost
{
    use SerializesModels;

    private $comment;

    /**
     * Create a new event instance.
     *
     * @param  \App\Models\Comment  $comment
     * @return void
     */
    public function __construct(Comment $comment)
    {
        $this->comment = $comment;
    }


    /**
     * Comment
     *
     * @return \App\Models\Comment  $comment
     */
    public function comment(): Comment
    {
        return $this->comment;
    }
}

 
 

Configurar Listeners no Laravel

O próximo passo é configurar os Listeners, que são as ações si, aqui você pode fazer diversas ações, como registrar log, salvar alguma informação no banco de dados, incrementar uma quantidade, enviar um e-mail, enviar SMS e etc.

Neste exemplo vamos inicialmente registrar logs, apenas para demonstrar o Event funcionando, implemente o Listener:

namespace App\Listeners;

use Log;
use App\Events\CommentedPost;

class SendMailCommentedPost
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  \App\Events\CommentedPost  $event
     * @return void
     */
    public function handle(CommentedPost $event)
    {
        // Ex1: Access the comment using $event->comment...
        // Ex2: Access the comment using $event->comment()...

        // Registring log commented post
        Log::info($event->comment());
    }
}

No método construtor do Listener pode definir alguns comportamentos iniciais, como por exemplo injetar algumas classes.

E no método handle() que deve ficar a ação em si, como enviar e-mail, ou registrar log, ou salvar algo no banco de dados, enfim.

NOTA: Neste Listener está injetando automaticamente o objeto do Event CommentedPost, e a partir deste objeto podemos acessar os atributos públicos e métodos do Event CommentedPost;

 
 

Disparar Eventos no Laravel

Agora que já criou o Event em app/Events/CommentedPost.php e criou o Listener em app/Listeners/SendMailCommentedPost.php e já vinculou o Listener ao Event no Provider app/Providers/EventServiceProvider.php no atributo $listen, o próximo passo é de fato disparar o evento.

Exemplo prático:

namespace App\Http\Controllers\Posts;

use App\Models\Post;
use App\Events\CommentedPost;
use App\Http\Controllers\Controller;

class MessageController extends Controller
{
    /**
     * Ship the given order.
     *
     * @param  int  $orderId
     * @return Response
     */
    public function store(Request $request, Post $post)
	{
		$post = $post->find($request->id);

		$comment = $post->comments()->create($request->all());

		// Dispatching Event
		event(new CommentedPost($comment));

		return redirect()
					->route('posts.show', $post->id)
					->withSuccess('Comentário realizado com sucesso!');
	}
}

Agora ao fazer um novo comentário por usar o helper event() vai automaticamente disparar o nosso evento, que por sua vez vai disparar os Listeners (Ouvintes) e fazer as ações necessárias, neste simples exemplo vai registrar o log com o comentário.

 

Esse exemplo continua neste próximo tutorial

 

Carlos Ferreira

Sobre o Autor:

Carlos Ferreira

Carlos Ferreira é Analista de Sistemas Experiente, Empreendedor, Fundador da empresa EspecializaTi. Certificações: Comptia Linux +, LPI, Novell Certification.

Todos os direitos reservados © 2018 - EspecializaTi. É proibida a reprodução total ou parcial deste conteúdo.