Bổ sung attributes request trong Laravel Chuyên mục PHP và Laravel 2023-07-29 715 Lượt xem 65 Lượt thích 0 Bình luận

Đôi khi, bạn có thể muốn bổ sung các thuộc tính vào request ban đầu đã được thực hiện cho ứng dụng Laravel. Chẳng hạn, bạn muốn kiểm tra riêng của mình mình vào middleware để xem liệu người dùng có được phép truy cập trang hay không và chuyển “check” đó bằng cách đính kèm nó dưới dạng thuộc tính bổ sung cho request.
Bằng cách này, bạn cũng có thể ngăn duplicating code, trong đó bạn sẽ lặp lại cùng một mã code (hoặc truy vấn) trong middleware và trong controller. Ví dụ như sau. Nếu mình chỉ muốn cho phép những người dùng có is_active được đặt thành “1”, mình sẽ viết truy vấn sau hai lần như này:
- SomeUserMiddleware.php
public function handle($request, Closure $next)
{
//get the user Id
$userId = $request->route('id');
//find the user
$user = User::where('is_active', 1)->where('id', $userId)->first();
//check if the logged in user exists
if (!$user->exists()) {
//redirect them if they don't exist
return redirect()->route('redirectRoute');
}
return $next($request);
}
- UserController.php
public function view($id)
{
$user = User::where('is_active', 1)->where('id', $userId)->first();
return view('users.view', ['page' => $user]);
}
Như bạn có thể thấy, truy vấn tìm lấy người dùng đã được viết hai lần. Điều này chỉ đơn giản là lãng phí tài nguyên, phải không?
Sử dụng merge method
Bạn có thể re-factor lại code ở trên bằng cách gọi phương thức merge theo request và pass $user từ middleware như này.
- SomeUserMiddleware.php
public function handle($request, Closure $next)
{
//get the user Id
$userId = $request->route('id');
//find the user
$user = User::where('is_active', 1)->where('id', $userId)->first();
//check if the logged in user exists
if (!$user->exists()) {
//redirect them if they don't exist
return redirect()->route('redirectRoute');
}
//pass the attribute onto the request
$request->merge(['user' => $user]);
return $next($request);
}
Và truy xuất, giả sử, trong một controller bạn có thể làm như này.
public function view($id)
{
return view('users.view', ['user' => $request->user]);
}
Lợi ích của việc trên là bây giờ chúng ta chỉ cần thực hiện một truy vấn duy nhất và chuyển nó vào request có thể được sử dụng lại ở nơi khác (trong trường hợp của chúng ta là controller). Và điều này cũng sẽ làm cho controller trở nên “thin” như một bonus bổ sung!

Bình luận (0)