Đặt tên Route và nhóm Route (Route group)

Trong bài trước chúng ta đã tìm hiểu cơ bản về Route trong Laravel rồi phải không nào. Trong bài này chúng ta sẽ tiếp tục tìm hiểu về cách đặt tên cho route và cách nhóm các route trong Laravel các bạn nhé. Không lam man nữa ngay bây giờ chúng ta bắt tay vào bài viết thôi!

1. Đặt tên route (Set name for route)

Thay vì nhớ các URI của từng route thì chúng ta có thể đặt tên cho nó để dễ dàng tương tác bằng phương thức name.

Route::get('home', function () {
    //
})->name('home');

Cùng với việc đặt tên sẽ dễ dàng lấy url từ route:

$url = route('home');

hay cũng như chuyển hướng đến route đó:

return redirect()->route('home');

Nếu route được đặt tên có chứa tham số, ta có thể dễ dàng truyền giá trị cho tham số bằng cách:

Route::get('profile/{id}', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1]); // /profile/1

2. Nhóm route (Route group)

Các route nằm trong cùng một nhóm sẽ được chia sẻ các thuộc tính route như namespace, middleware, tiền tố tên (Route named prefix), tiền tố URI,... dưới đây là chi tiết các thuộc tính  

2.1 Middleware route

Để gán middleware cho các route chung một nhóm, các bạn có thể sử dụng phương thức middleware để lồng các route con.

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Uses first & second Middleware
    });
    Route::get('user/profile', function () {
        // Uses first & second Middleware
    });
});

2.2 Namespace route

Với method namespace bạn sẽ khai báo namespace cho tất cả các route con nằm trong nó, chẳng hạn:

Route::namespace('Admin')->group(function () {
    // Controllers Within The "App\Http\Controllers\Admin" Namespace
});

Mọi controller được gọi trong nhóm này sẽ được thêm namespace App\Http\Controllers\Admin

Mặc định RouteServiceProvider đã kết nối các file route trong một group, cho phép bạn đăng ký các controller mà không cần đến đầy đủ namespace App\Http\Controllers. Vì vậy để khai báo một controller, bạn chỉ cần khai báo namespace do bạn phân cấp cùng với tên của controller.

2.3 Sub-domain route

Laravel còn cung cấp cho chúng ta nhóm sub-domain. Nhóm này có thể chỉ định tham số như một URI, cho phép ta có thể giữ một phần sub-domain để sử dụng trong các route con. Để khai báo nhóm sub-domain, bạn sử dụng method domain như sau:

Route::domain('{account}.myapp.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

Tham số {account} đóng vai trò như một thành phần của từng URI route con, nên thứ tự phải được đứng trước vì toàn bộ URI sẽ là 

{account}.myapp.com/user/{id}.

Lưu ý: Để đảm bảo các route sub-domain có thể hoạt động, bạn nên khai báo các route này trước các route domain gốc, điều này sẽ ngăn không cho domain gốc ghi đè lên các sub-domain có cùng URI.

2.4 Tiền tố URI route (Route prefix)

Giả sử ứng dụng của bạn có admin cpanel để quản lý nội dung, nhưng có rất nhiều route có URI chứa admin. Để gom chúng lại thành một nhóm, ta sử dụng method prefix do Laravel cung cấp.

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // Matches The "/admin/users" URL
    });
});

Dấu / sẽ tự động thêm nên bạn không cần phải lo lắng vì điều đó.

2.5 Tiền tố tên route (Route named prefix)

Cũng như route prefix, route named prefix sẽ thêm tiền tố tên chung cho mỗi route con nằm trong nhóm.

Route::name('admin.')->group(function () {
    Route::get('users', function () {
        // Route assigned name "admin.users"...
    })->name('users');
});

Bạn có thể thay thế ký tự ngăn cách . bằng ký tự khác, miễn sao phù hợp cú pháp code PHP.

Nếu như có một nhóm route có cùng chung namespace, prefix, name chẳng hạn thì ta có thể gom các thuộc tính này vào Route::group.

Route::group([
    'namespace' => 'Admin', 
    'prefix' => 'admin', 
    'name' => 'admin.'
], function() {
    //
});

Chú ý: Khi bạn build app với routes/api.php thì các route được khai báo sẽ tự động đưa vào trong một route group có prefix là /api.

Lời kết:

Trên đây là cách đặt tên Route và nhóm Route (Route group) trong Laravel. Có gì chưa hiểu các bạn hãy comment bên dưới chúng mình sẽ giải đáp một cách nhanh nhất nhé!

Bình luận