Khi bạn xây dựng một ứng dụng Laravel và cần định nghĩa phần quản trị (Admin). Có nhiều cách làm, trong bài viết này, daipho.com xin chia sẻ cách dùng Route Group.
Đề bài
Giả sử bạn đang xây dựng một trang web bằng Laravel và trong đó có phần quản trị (admin). Bạn muốn nhóm tất cả các route
liên quan đến phần quản trị và áp dụng middleware
xác thực admin
cho chúng. Đây là cách bạn có thể làm điều đó bằng cách sử dụng Route Group
.
Route::prefix('admin')->middleware('auth', 'admin')->group(function () { // Định nghĩa các route cho phần quản trị Route::get('/dashboard', 'AdminController@dashboard'); Route::get('/users', 'AdminController@users'); Route::get('/settings', 'AdminController@settings'); // Các route khác... });
Trong ví dụ này:
-
prefix('admin')
: Thêm tiền tố “admin
” vào tất cả các route trong nhóm này, do đó, tất cả các route sẽ bắt đầu với “/admin"
.
middleware('auth', 'admin')
: Áp dụng middleware'auth'
và'admin'
cho tất cả các route trong nhóm này. Middleware'auth'
sẽ xác thực người dùng, trong khi middleware'admin'
sẽ kiểm tra quyền hạn của người dùng để đảm bảo họ có quyền truy cập vào phần quản trị.group(function () { /* ... */ })
: Nhóm tất cả các route lại với nhau và áp dụng các thuộc tính chung cho nhóm route đó.
Mở rộng
Nếu Dai Pho có nhiều loại quyền như Admin
, Editor
, Creator
, Dai Pho có thể sử dụng một middleware tùy chỉnh
để kiểm tra quyền truy cập của người dùng dựa trên loại quyền mà họ có.
Dai Pho thực hiện như sau:
Tạo Middleware Tùy Chỉnh:
Bạn có thể tạo một middleware mới, chẳng hạn là CheckRoleMiddleware
, để kiểm tra quyền truy cập của người dùng dựa trên loại quyền của họ.
Middleware này sẽ kiểm tra xem người dùng có quyền tương ứng với route hay không.
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class CheckRole { public function handle($request, Closure $next, ...$roles) { $user = Auth::user(); if ($user && in_array($user->role, $roles)) { return $next($request); } return redirect('/')->with('error', 'Unauthorized access.'); } }
Lưu Trữ Quyền Trong Cơ Sở Dữ Liệu:
Bạn có thể lưu trữ các loại quyền như ‘Admin
‘, ‘Editor
‘, ‘Creator
‘ trong cơ sở dữ liệu, cùng với mỗi người dùng hoặc trong một bảng riêng biệt.
Mỗi người dùng sẽ được gán một hoặc nhiều loại quyền.
Kiểm Tra Quyền Trong Middleware:
Tiếp theo, Dai Pho sẽ sử dụng Route Group
để nhóm các route có liên quan và áp dụng middleware kiểm tra quyền cho chúng.
Nếu người dùng có quyền tương ứng với route, yêu cầu sẽ tiếp tục. Nếu không, Đại Phố sẽ xử lý yêu cầu bằng cách chuyển hướng hoặc trả về một trang lỗi.
use App\Http\Middleware\CheckRole; Route::prefix('admin')->middleware('auth')->group(function () { // Route cho Admin Route::group(['middleware' => 'role:admin'], function () { Route::get('/dashboard', 'AdminController@dashboard'); // Các route admin khác... }); // Route cho Editor Route::group(['middleware' => 'role:editor'], function () { Route::get('/posts', 'EditorController@posts'); // Các route editor khác... }); // Route cho Creator Route::group(['middleware' => 'role:creator'], function () { Route::get('/create', 'CreatorController@create'); // Các route creator khác... }); });
Trong ví dụ này:
Route Group
được sử dụng để nhóm các route của mỗi loại quyền truy cập (‘admin
‘, ‘editor
‘, ‘creator
‘).- Mỗi
Route Group
áp dụng một middleware tùy chỉnh (CheckRole
) để kiểm tra xem người dùng có quyền tương ứng với loại quyền được yêu cầu hay không. - Route của từng loại quyền được định nghĩa bên trong mỗi
Route Group
tương ứng.