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!
0 Comments