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

Laravel Route Model Binding cho người mới bắt đầu

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 =))

https://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 RouteServiceProvider thay 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 boot là đượ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:

<?php
namespace App\Http\Controllers;

use App\Models\User;

class UserController {
	
	public function show(User $user) {
		// can use $user here
	}
}

Đơn giản nhỉ 😉

4/ Conclusion

Đây là 1 best practice của Laravel mà chúng ta nên follow sử dụng. Nó sẽ speed up quá trình development rất nhiều cũng như an toàn khi sử dụng (yên tâm, test cases, unit testing đầy đủ từ team Laravel vip pro roài)

Thanks 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