Quay lại

Laravel Route Model Bindings - Implicit Vs. Explicit Binding Chuyên mục PHP và Laravel    2023-07-30    1.2k Lượt xem    60 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Laravel Route Model Bindings - Implicit Vs. Explicit Binding

Có một tính năng thú vị này trong Laravel, nơi bạn có thể xác thực các ID model đã được đưa vào route bằng cách đưa các instances trực tiếp vào route level.

Chẳng hạn, thay vì đưa post_id vào URL sau, chẳng hạn như 'api/posts/{post_id}' và tự viết tất cả logic nghiệp vụ chỉ để xác thực ID model, chúng ta có thể trực tiếp chuyển toàn bộ Post model instance phù hợp với quy tắc đã cho ID trong URL.

Bạn có thể đạt được điều này bằng hai phương pháp: Implicit Model Binding và Explicit Model Binding.

Implicit Binding

Trong phương pháp này, bạn sẽ đưa trực tiếp model instance vào actions của route hoặc controller có tên biến khớp với tên route biến trong route nhé !. Hãy viết ví dụ trên bằng cách sử dụng phương pháp này.

Route::get('api/posts/{post}', function (App\Post $post) {
    return $post->title;
});

//e.g. => http://myblog.com/api/posts/12

Lưu ý ở đây, chúng ta đã chuyển biến $post cho closure của route được type-hinted là model App\Post và tên biến ($post) khớp với phân đoạn URI {post} của URL. Sau đó, Laravel sẽ tự động thêm đối tượng model có trường id khớp với giá trị tương ứng từ URI yêu cầu. Nếu không tìm thấy model instance phù hợp trong cơ sở dữ liệu, phản hồi HTTP 404 sẽ tự động được tạo cho tuyến đường cụ thể đó.

Explicit Binding

Như tên gợi ý, cách tiếp cận này yêu cầu bạn đăng ký một ràng buộc "explicit" bằng cách sử dụng model method để chỉ định class cho một tham số nhất định. Bạn có thể đạt được điều này bằng cách explicit model bindings của mình trong phương thức root của class RouteServiceProvider. Bây giờ chúng ta hãy viết lại ví dụ trên bằng cách sử dụng phương pháp này.

public function boot()
{
    parent::boot();

    Route::model('post', App\Post::class);
}

Bây giờ, xác định route chứa post param:

Route::get('posts/{post}', function (App\Post $post) {
    // Do something here
});

Vì chúng ta đã ràng buộc tất cả các tham số {post} với model App\Post, nên một User instance sẽ được đưa vào route. Vì vậy, ví dụ: một request đối với posts/7 sẽ đưa Post instance từ cơ sở dữ liệu có id là 7. Nếu không tìm thấy model instance phù hợp cho id đã chỉ định, nó sẽ tự động tạo phản hồi 404.

Sự khác biệt giữa implicit và explicit binding là bạn có thể chỉ định thêm logic tùy chỉnh vào phương thức root của lớp RouteServiceProvider trong khi thực hiện explicit binding. Hãy kiểm tra đoạn mã sau:

public function boot()
{
    parent::boot();

    Route::bind('post', function ($value) {
        return App\Post::where('slug', $value)->first() ?? abort(404);
    });
}

//e.g. => http://myblog.com/posts/new-in-laravel

Như bạn có thể thấy ở đây, chúng ta đã sử dụng phương thức Route::bind để viết logic của riêng mình. Bây giờ, thay vì kiểm tra 'post' bằng trường id của model, giờ đây Eloquoent sẽ kiểm tra logic tùy chỉnh mà chúng ta đã viết trong Phương thức Closure của bind method. Ở đây, đối với URL ví dụ trên, new-in-laravel sẽ được chuyển dưới dạng $value cho Closure, sau đó sẽ được kiểm tra theo điều kiện tùy chỉnh đã chỉ định và trả về kết quả tương ứng.

Ngoài ra, bạn có thể ghi đè phương thức resolveRouteBinding trong Eloquent model của mình.

// App\Post model

public function resolveRouteBinding($value)
{
    return $this->where('slug', $value)->first() ?? abort(404);
}
 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday