Làm thứ làm cho Laravel Request của bạn thú vị hơn

Laravel Eloquent Observers – Tiếp nối Event Handling

Hello friends,

Hôm nay mình qua 1 cái cũng khá là hay của Laravel Eloquent, đó chính là Eloquent Observer.

Cái này thì thuộc về phạm vi tầm trung trong giai đoạn sử dụng, giai đoạn gọi là nâng cao dần về flexibility,… :))

Cần có chút kiến thức về Laravel Events (Event Handling) trước khi đọc bài này nha các bạn, nếu các bạn chưa biết thì có thể tham khảo: https://sethphat.com/sp-967/laravel-tim-hieu-va-di-sau-vao-event-handling

1/ Laravel Eloquent Observers là gì?

Đây là 1 phương thức để các bạn register specific action vào Eloquent’s Lifecycle. Thay vì các bạn dùng:

  • Tạo ra Event & Listener khi Model add/edit/…
  • Override constructor và tự viết 1 closure và bind vào created, updated,…

2 cái ở trên sẽ khiến code bạn không chỉ xấu đi mà cũng khó inject, maintainable,… Tuy nhiên với Observer thì nó lại ngon lành và đơn giản + clean hơn.

Bạn chỉ đơn giản là tạo 1 class Observer và register nó trong ServiceProvider. Then you’re done.

4 methods mà ta có thể listen:

  • created: sau khi tạo 1 record mới
  • updated: sau khi update 1 record có sẵn
  • deleted: sau khi xóa 1 record có sẵn
  • forceDeleted: sau khi xóa 1 record có sẵn (force hard delete – chỉ xài khi bạn sử dụng SoftDelete)

Documentation: https://laravel.com/docs/6.x/eloquent#observers

2/ Trải nghiệm implement cái Laravel Eloquent Observers

Note:

  • Naming convention: {ModelName}Observer
    • UserObserver
    • ArticleObserver
    • SethPhatBlogObserver
  • Observer Path: app/Observers (có s)

2.1/ Tạo Observer Class

Dùng Laravel’s Artisan Command:

php artisan make:observer UserObserver –model=User

Dùng cơm:

  • Tạo folder app/Observers (nếu chưa có)
  • Tạo 1 class mới với định dạng tên là {ModelName}Observer
  • Define những function mà muốn listen (created, updated,…)

Về cơ bản thì chúng ta sẽ dc 1 file như sau:

<?php

namespace App\Observers;

use App\User;

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

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

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

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

Ví dụ mình chỉ cần listen vào mỗi khi User dc updated, thì mình xóa toàn bộ các functions ko cần thiết. Ngoài ra thì define thêm 1 số action mình muốn:

<?php

namespace App\Observers;

use App\User;

class UserObserver
{
    /**
     * Handle the User "updated" event.
     *
     * @param  \App\User  $user
     * @return void
     */
    public function updated(User $user)
    {
	// set user ip after updated 
	$user->ip_address = request()->getClientIp();
	$user->save();
    }

}

Ngon hehe. Các bạn cũng lưu ý là cái nào mình ko listen tới, xóa đi cho đẹp file nhé cũng để Laravel nó đỡ fải chạy vào.

2.2/ Register Model với Observer Class

Mình ưu tiên tạo 1 ServiceProvider mới, các bạn có thể sử dụng tiếp vào cái AppServiceProvider cũng dc. Tuy nhiên mình tạo mới để group lại những các riêng biệt, ko mixed tùm lum vào.

Register vào trong method boot nhé:

<?php

namespace App\Providers;

use App\Observers\UserObserver;
use App\User;
use Illuminate\Support\ServiceProvider;

class ObserverServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        User::observe(UserObserver::class);
    }
}

Xong rùi. Giờ test thui =))

3/ Finalization about Laravel Eloquent Observers

Đây là 1 feature khá hay từ Laravel, nó giúp ta đạt những điều như:

  • Flexibility
  • Clean Code
  • Extendable

Với Laravel Eloquent Observers, bạn có thể listen vào những event action của Eloquent dễ dàng và ko fải chơi những trick code dơ dáy nữa.

Thank you for reading!!!

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ê ;)

Leave a Reply

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

Bình luận qua Facebook