Model trong Laravel là gì

Facebook
Twitter

Hi các bạn,

Tiếp tục lại Laravel nhé. Hôm nay mình sẽ hướng dẫn các bạn qua Laravel Route Model Binding.

Đây là 1 cái giúp các bạn khỏe hơn rất nhiều trong quá trình development

1/ Laravel Route Model Binding là gì?

Là 1 feature built-in trong Laravel, giúp load luôn cả record trong DB tùy theo ID/Info tương ứng dc truyền vào Route, cuối cùng tại Controller [hoặc Middleware, Request] ta sẽ access dc Eloquent Model tương ứng:

Ví dụ:

  • user/{id}
  • article/{id}
  • category/{id}

Theo thông thường, ta sẽ phải User::find[$id]hoặc User::findOrFail[$id]

Tuy nhiên, với Route Model Binding feature. Ta ko cần phải làm vụ đó nữa. Thật tuyệt vời fải ko các bạn.

Nếu mà record ko có trong DB, Laravel sẽ tự động throw Error 404 ra luôn cho users. Quá nhẹ nhàng và tiện lợi.

2/ Sử dụng Laravel Route Model Binding

2.1/ Thông qua Implicit

Theo cách này, Laravel sẽ tự động tìm Model của bạn thông qua cái tên mà bạn điền trong route, ví dụ:

  • Route::get['user/{user}', '...'];=> User Model
  • Route::get['user-permission/{userPermission}', '..'];=> UserPermission Model

Lưu ý nhớ để ở dạng camelCase nhé.

Thêm special cases nè, query vào 1 field khác thay vì id:

  • Route::get['article/{article:slug}', '...'];=> Sẽ query vào cột slug thay vì id để lấy Article theo Slug

Ngoài ra bạn cũng có thể define ở trong Eloquent, Mà cứ vào đây để bik thêm chi tiết nha =]]

//laravel.com/docs/8.x/routing#implicit-binding

2.2/ Thông qua Explicit

Thông qua cách này, bạn sẽ tự phải register tại RouteServiceProviderthay vì để Laravel tự dọn cơm ra cho ăn sẵn

Cách này ta thường dùng khi ta muốn đặt tên route-model theo 1 chiều hướng khác, ví dụ như:

  • {userM}
  • {auditM}
  • {postM}

Để khi chúng ta code, dễ nhận dạng hơn, dễ đọc [readable] và dễ hiểu.

Ngoài ra thì ta cũng có thể register theo 1 logic query đặc biệt với Model đó.

Ở RouteServiceProvider, ta chỉ cần register trong bootlà được, như sau:

/** * Define your route model bindings, pattern filters, etc. * * @return void */ public function boot[] { Route::model['user', User::class]; // ... }

3/ Access Model sau khi Binding

Tại Request class:

class UpdateUserRequest extends Request { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize[]: bool { // can access model here $user = $this->route['user']; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules[]: array { // can access model here $user = $this->route['user']; return []; } /** * Custom error messages * * @return array */ public function messages[]: array { // can access model here $user = $this->route['user']; return []; } }

Tại Middleware handle method:

/** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle[$request, Closure $next] { $post = $request->route['post']; $user = $request->route['user']; /// .. do or check something }

Tại Controller:

Chủ Đề