Laravel Tutorial

Bài 30: Event trong Eloquent Model Laravel

Trong Eloquent, Laravel có cung cấp thêm các event (sự kiện) để thực thi các code 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.

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

# 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

Ví dụ: assign saveddeleted model event cho UserSavedUserDeleted 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,
    ];
}/

# Sử dụng slosure

Đối với cách này thì các bạn chỉ cần khai báo code 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.

Ví dụ: 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) {
            //
        });
    }
}

# 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.

Ví dụ: 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 "restored" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function restored(User $user)
    {
        //
    }

    /**
     * Handle the User "force deleted" 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

Ví dụ: đă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);
}

2. Mute Event

Trong một số trường hợp nhất định bạn không muốn một tác vụ đặ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

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

$user = User::findOrFail(1);
$user->name = 'Victoria Faith';
$user->saveQuietly();

 

Leave a Comment