Laravel Event Handling

Laravel – Tìm hiểu và đi sâu vào Event Handling

Hello mina-san,

Nay lại là 1 bài về Laravel nè, một cái stuff rất là hay dành cho hệ thống của chúng ta và giúp hệ thống chúng ta dynamic hơn.

Main documentation: https://laravel.com/docs/5.8/events

1/ Giới thiệu qua ngôn ngữ tiếng Việt

Event (hay còn dc biết đến là Hook) là 1 phương thức để các bạn inject 1 specific-code nào đó vào 1 luồng chạy. Điều này khiến cho cái flow của bạn nó dynamic hơn cũng như là tuân thủ cái rule trong SOLID.

Cuộc sống không Event

Ví dụ cụ thể, mình có 1 flow là Update User, basically nó như vậy ở version 1:

  • Update
  • Return result

Trong tương lai, ở version 2, bỗng nhưng dc request là khi User update thì cũng phải update cái Audit Log để track lại. Theo cách thông thường thì ta sẽ:

  • Update (code cũ)
  • Audit Log (code mới)
  • Return result (code cũ)

Trong tương lai, nếu lại update thêm actions nữa thì ta lại append thêm code => vi phạm Rule O của SOLID cũng như là khiến controller nó như củ chuối.

Cuộc sống có Event

Nếu xài Event thì nó sẽ như sau:

  • Update
  • Fire Event
    • Run Listener(s) that binded to the current event
  • Result result

Và mỗi lần update, ta chỉ cần define thêm Listener và bind vào event đó. Khiến ta ko vi phạm Rule của SOLID mà lại đẹp code, flow hoàn hảo hơn.

Và ngoài ra nó lại dc support tận răng, dễ debug,…

Đại loại dễ hiểu lã vậy…

2/ Laravel Event Handling – Core Concepts

Event

Event là sự kiện, dc define tại một thời điểm nào đó trong flow. Mỗi Event khác nhau sẽ có những data khác nhau để truyền vào (tùy theo flow của bạn :D).

Listener

Listener là nơi xử lý (process) cái event nào đó của bạn.

Queued Listener

Như trên, có điều listener này là dc chạy qua Laravel Queue hay gửi Message Queue đi thay vì phải xử lý trực tiếp tại thread hiện tại :D.

Dispatching Event

Là một nơi nào đó ở khâu processing của chúng ta, với Event đã defined, ta sẽ dispatch (run) Event này và truyền vào những data nhất định cho Event đó.

Khi dispatching thì Event đó nó sẽ tự tìm tới những Listeners đã dc bind với Event và run những Listener đó.

Event Subscriber

Cũng là một phương thức để lắng nghe (listen) một Event, có điều là nó có thể listen nhiều Events chỉ trong 1 class và ta sẽ define thông qua hàm subscribe

Event Discovery

Cũng giống như Service Provider discovery, Laravel’s engine sẽ tự discover những Events trong package của bạn (với một số setting cơ bản là lúc composer dump-autoload nó sẽ tự đi discover)

Mặc định Laravel sẽ ko tự discover events.

3/ Laravel Event Handling – Khởi tạo Service Provider

Tạo EventServiceProvider vào app/Providers

Define cái class như sau nè:

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        //
    ];
}

Tất cả Events và Listeners sẽ dc mapping/binding vào cái $listen, demo như sau:

protected $listen = [
        Registered::class => [ // event là đã đăng ký
            SendEmailVerificationNotification::class, // listener là gửi email verification
        ],
     [...]
   ];

4/ Tạo Event đầu tiên cho App của bạn

Sử dụng artisan sẽ giúp ta hoàn thành điều này với câu lệnh sau: “php artisan event:generate”

Vào app/Events sẽ thấy nó đã tạo ra Event.

Define một số đầu vào cho cái Event nè

5/ Tạo Listener đầu tiên cho App của bạn

 

6/ Dispatch Event nào

 

7/ Kết luận

Mai viết tiếp nha 😀

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

2 thoughts on “Laravel – Tìm hiểu và đi sâu vào Event Handling

Leave a Reply

Your email address will not be published. Required fields are marked *

Bình luận qua Facebook