Route trong Laravel 8 - Cách sử dụng route

Trong bài tiếp theo về route trong Laravel này chúng mình sẽ cùng tìm hiểu các khái niệm, tính năng liên quan của route trong Laravel 8 đặc biệt là học cách sử dụng route qua các ví dụ nhé!

1. Truyền tham số  trong route.

Trong Laravel 8 để route có thể nhận tham số (parameter) thì bạn chỉ cần thêm cú pháp {name} vào trong $uri với name là định danh cho parameter đó.

VD:

Route::get('user/{id}', function ($id) {
    return "User id: $id";
});

Kết quả:

Tuy nhiên nếu bạn vào không truyền user id vào trong URL thì laravel sẽ trả về 404 vì không có parameter.

Nếu bạn muốn truyền vào URL một parameter không bắt buộc thì bạn chỉ việc thêm dấu ? vào sau partern string. Và đồng thời cũng thêm giá trị default cho callback để khỏi vị lỗi code.

VD: Chuyển id parameter ở ví dụ trên về dạng optional.

Route::get('user/{id?}', function ($id = null) {
    if (!$id) {
       return "Bạn hãy nhập vào  id";
    }

    return "User id: $id";
});

Kết quả:

Bạn cũng có thể sử dụng nhiều tham số trong route.

VD:

Route::get('user/{id}/comment/{commentId}', function ($id, $commentId) {
    return "User id: $id and comment id: $commentId";
});

Tham số có thể là chữ hay số hay là một kí tự đặc biệt nào đó thì route đó vẫn không lỗi vì ta không định dạng kiểu dữ liệu cho tham số.

Trong trường hợp bạn muốn định dạng kiểu dữ liệu hay pattern của parameter thì bạn cần sử dụng phương thức where với cú pháp như sau:

where($name, $pattern)

// or

where([$name => $pattern])

Trong đó:

  • $name là parameter name.
  • $pattern là biểu thức regular expression.

VD: Mình muốn id, commentId parameter trong ví dụ trên bắt buộc phải là số.

Route::get('user/{id}/comment/{commentId}', function ($id, $commentId) {
    return "User id: $id and comment id: $commentId";
})->where('id', '[0-9]+')->where('commentId', '[0-9]+');

Hoặc các bạn có thể truyền array vào phương thức where theo cách này:

Route::get('user/{id}/comment/{commentId}', function ($id, $commentId) {
    return "User id: $id and comment id: $commentId";
})->where(['id' => '[0-9]+', 'commentId' => '[0-9]+']);

Giờ nếu các bạn nhập một trong hai hoặc cả hai giá trị của parameter trên là chuỗi hoặc kí tự đặc biệt thì sẽ không matching với route này nữa.

Ngoài ra Laravel 8 còn cung cấp sẵn một số các phương thức where kèm với regex phổ biến như sau:

  • whereNumber($name): tương đương với where($name, '[0-9]+')
  • whereAlpha($name): tương đương với where($name, '[a-zA-Z]+')
  • whereAlphaNumeric($name): tương đương với where($name, '[a-zA-Z0-9]+')
  • whereUuid($name): tương đương với where($name, '[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}') (định dạng UUID)

Nếu như bạn muốn định nghĩa pattern cho tất cả route parameter name nào đó. Bạn có thể sử dụng:

Route::pattern($name, $pattern);

Trong đó:

  • $name là parameter name.
  • $pattern là biểu thức regular expression.

Lúc này tất cả các route parameter được khai báo và thực thi sau Route::pattern sẽ hoạt động. Để hoạt động tốt nhất đối với tất cả các loại route thì bạn nên khai báo trong phương thức boot của file app/Providers/RouteServiceProvider.php

VD: Khai báo tất cả các route có parameter name là id sẽ đều phải là số.

/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');
}

2. Dependency injection với route.

Dependency Injection là một thuật ngữ dùng chỉ việc giải quyết các phục thuộc của một object thông qua constructor. Trong Laravel dependency injection xuất hiện ở mọi nơi và đương nhiên đối với callback trong route cũng có.

VD: Dependency Request vào route.

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::get('/users', function (Request $request) {
    // ...
});

Đối với các route có tham số các bạn sẽ phải để các tham số dependency phía trước, sau đó các tham số sẽ đặt sau các dependency.

VD:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::get('user/{id}/comment/{commentId}', function (Request $request, $id, $commentId) {
    return "User id: $id and comment id: $commentId";
})->where(['id' => '[0-9]+', 'commentId' => '[0-9]+']);

3. Đặt tên cho route.

Laravel 8 cũng cho phép chúng ta đặt tên cho route để tiện cho việc quản lý và generate ra route URL.

Để gán tên cho route thì bạn chỉ cần sử dụng phương thức name  hoặc as với cú pháp như sau:

name($name)

// hoặc

as($name)

Trong đó:$name là tên route mà bạn muốn đặt.

VD: Đặt tên cho route có path là /user/profile tên là profile.

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

Đối với trường hợp bạn muốn đặt prefix cho tất cả route trong group thì bạn cũng sử dụng phương thức as hoặc name với cú pháp tương tự.

Ví Dụ: Với phương thức as

Route::prefix('user')->as('user.')->group(function () {
    Route::get('profile', function () {
        //
    })->name('profile');

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

Ví Dụ: Với phương thức name.

Route::prefix('user')->name('user.')->group(function () {
    Route::get('profile', function () {
        //
    })->name('profile');

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

4. Generate URL sử dụng route name.

Để tạo ra URL qua route name thì bạn sử dụng phương thức route() với cú pháp sau:

route($name, $parameter);

Trong đó:

  •  $name là tên của route.
  • $parameter là một mảng chưa các tham số truyền vào route. Nếu route không có tham số đó thì nó sẽ trở thành URL query string.

VD:

routes/web.php

use Illuminate\Support\Facades\Route;

Route::get('/welcome')->name('welcome');

Route::prefix('user')->as('user.')->group(function () {
    Route::get('profile', function () {
        //
    })->name('profile');

    Route::get('post/{id}', function () {
        //
    })->name('show.post');
});

Với route như trên thì generate URL qua route() sẽ có dạng như sau:

route('home')
// http://example.com/welcome

route('user.profile')
// http://example.com/user/profile

route('user.show.post', ['id' => 10]);
// http://example.com/user/post/10

route('user.profile', ['id' => 10]);
// http://example.com/user/profile?id=10

5. Lời kết.

Laravel hỗ trợ route mạnh và  laravel 8 còn hỗ trợ route mạnh hơn. Còn nhiều tính năng khác của route laravel 8 thế nhưng bài hơi dài rồi vì vậy hẹn gặp các bạn ở bài sau nhé!

Bình luận