Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 32: Event trong Eloquent Model Laravel 8

Tiếp tục với eloquent ORM trong Laravel, phần này mình sẽ giới thiệu với mọi người về event trong eloquent ORM.

1. Giới thiệu.

Trong Eloquent, Laravel có cung cấp thêm các sự kiện để cho mọi người thực thi các logic khi cần. Các event này bao gồm:

Event Mô tả
retrieved event này sẽ được bắn ra khi chúng ta thực thi get dữ liệu trong database.
creating event này được bắn ra trong quá trình thực thi lưu trữ dữ liệu vào trong database.
created event này được bắn ra sau khi lưu trữ dữ liệu vào trong database thành công.
updating event này được bắn ra trong quá trình thực thi update dữ liệu vào trong database.
updated event này được bắn ra sau khi update dữ liệu vào trong database thành công.
saving event này được bắn ra trong quá trình thực thi lưu trữ hoặc update dữ liệu vào trong database, ngay cả khi dữ liệu của model không thay đổi.
saved event này được bắn ra sau khi quá trình thực thi lưu trữ hoặc update dữ liệu vào trong database, ngay cả khi dữ liệu của model không thay đổi.
deleting event này được bắn ra trong quá trình thực thi xóa dữ liệu trong database.
deleted event này được bắn ra sau khi xóa dữ liệu trong database thành công.
restoring event này được bắn ra trong quá trình restore dữ liệu trong database (soft delete).
restored event này được bắn ra sau khi restore dữ liệu trong database thành công (soft delete).
replicating event này được bắn ra trong quá trình replicate model.

2. Lắng nghe sự kiện trong eloquent model.

Để lắng nghe các sự kiện trong model, Laravel cũng hỗ trợ rất nhiều cách.

Cách 1: sử dụng event class

Đối với cách này thì bạn chỉ cần khai báo các event class tương ứng với model event vào trong thuộc tính $dispatchesEvents của model.

VD: assign saved, deleted model event cho UserSaved, UserDeleted event class.

<?php

namespace App\Models;

use App\Events\UserDeleted;
use App\Events\UserSaved;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The event map for the model.
     *
     * @var array
     */
    protected $dispatchesEvents = [
        'saved' => UserSaved::class,
        'deleted' => UserDeleted::class,
    ];
}

Lúc này các bạn chỉ việc khai báo các listener cho các event class kia là được (về event listener mình sẽ nói ở các bài sau).

Cách 2: sử dụng slosure

Đối với cách này thì các bạn chỉ cần khai báo logic cho các event vào trong phương thức booted của model với cú pháp sau:

protected static function booted()
{
    static::eventName(function ($modelData) {
        //
    });
}

Trong đó

  • eventName là event mà bạn muốn lắng nghe.
  • $modelData là model object chứa data của bản ghi đang, vừa được thực thi.

VD: Lắng nghe sự kiện created user trong model User.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The "booted" method of the model.
     *
     * @return void
     */
    protected static function booted()
    {
        static::created(function ($user) {
            //
        });
    }
}

Cách 3: Sử dụng Observer.

Nếu như bạn muốn lắng nghe được nhiều sự kiện trên model, bạn có thể sử dụng observer để gom nhóm các listener vào trong một class. Trong observer chứa các phương thức có tên trùng với tên của các event trong model.

Bạn có thể tạo mới observer bằng cách sử dụng command:

php artisan make:observer ObserverName --model=ModelName

Trong đó:

  • ObserverName là tên của Observer mà bạn muốn tạo.
  • ModelName là tên của model bạn muốn Observer lắng nghe.

VD: Tạo UserObserver lắng nghe event của User model

php artisan make:observer UserObserver --model=User

Sau khi run xong command thì file sẽ được lưu ở thư mục app/Observers. Trong trường hợp thư mục chưa tồn tại trong project thì Laravel sẽ tạo thư mục đó và put file vào đó.

File UserObserver vừa tạo sẽ có cấu trúc như sau:

<?php

namespace App\Observers;

use App\Models\User;

class UserObserver
{
    /**
     * Handle the User "created" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function created(User $user)
    {
        //
    }

    /**
     * Handle the User "updated" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function updated(User $user)
    {
        //
    }

    /**
     * Handle the User "deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function deleted(User $user)
    {
        //
    }

    /**
     * Handle the User "forceDeleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function forceDeleted(User $user)
    {
        //
    }
}

Các phương thức trong class này sẽ ứng với các event trong eloquent model.

Lúc này bạn muốn assign model event cho obsever, bạn cần đăng ký chúng vào trong phương thức boot của app/Providers/EventServiceProvider.php.

VD: đăng ký UserObserver vào User model.

use App\Models\User;
use App\Observers\UserObserver;

/**
 * Register any events for your application.
 *
 * @return void
 */
public function boot()
{
    User::observe(UserObserver::class);
}

3. Mute Event.

Trong một số trường hợp nhất định bạn không muốn một logic đặc biệt nào đó fire ra event, lúc này bạn có thể sử dụng phương thức withoutEvents để mute event.

VD:

use App\Models\User;

$user = User::withoutEvents(function () use () {
    User::findOrFail(1)->delete();

    return User::find(2);
});

Hoặc đối với việc save data bạn có thể sử dụng phương thức saveQuietly.

VD:

$user = User::findOrFail(1);

$user->name = 'Victoria Faith';

$user->saveQuietly();

4. Lời kết.

Eloquent Model event trong Laravel rất hữu dụng và sẽ được sử dụng tương đối nhiều trong dự án sau này. Vì vậy các bạn nên tìm hiểu kĩ về nó.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha