Laravel cơ bản
Laravel nâng cao
Quảng cáo

Route trong Laravel (tiếp)

Trong hướng dẫn này chúng ta sẽ xem xét cách truyền tham số vào route và cách sử dụng route để tạo URL trong Laravel

1. Truyền tham số trong Route.

Một phần quan trọng trong Route đó là truyền tham số (parameter) vào trong route. Để làm điều đó bạn chỉ cần thêm cú pháp {name} vào trong $uri trong đó name là định danh cho parameter.

Ví dụ

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

Kết quả truy cập domain.com/blog/3

Blog id: 3

Với code trên nếu bạn không truyền tham số id vào thì Laravel sẽ báo lỗi 404 vì không có route nào được định nghĩa có dạng domain.com/blog/. Do đó nếu bạn muốn truyền vào URL một tham số 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 bị lỗi 404.

Chuyển tham số id ở ví dụ trên về dạng optional (tùy chọn).

Ví dụ

Route::get('blog/{id?}', function ($id = null) {
    if (!$id) {
        return "Vui lòng nhập id";
    }

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

Kết quả nếu truy cập domain.com/blog/ sẽ không báo lỗi mà có thông báo

Vui lòng nhập id

Ngoài ra trong 1 route bạn có thể truyền nhiều tham số vào đó

Ví dụ

Route::get('blog/{id}/{slug}', function ($id, $slug) {
    return "Blog id: $id and slug is: $slug";
});

Kết quả khi truy cập domain.com/blog/id_bai_viet_5/bai-viet-moi :

Blog id: id_bai_viet_5 and slug is: bai-viet-moi

Trong ví dụ trên bạn có nhập id, slug là chữ hay số hay là bất kỳ một kí tự đặc biệt nào đó thì route đó vẫn matching. Nhưng trong thực tế chúng ta cần yêu cầu dữ liệu tham số đầu vào ở một định dạng dữ liệu mong muốn do đó nếu bạn muốn định dạng kiểu dữ liệu hay pattern của tham số thì bạn cần sử dụng phương thức where với cú pháp như sau:

where($name, $pattern)
where([$name => $pattern])


Trong đó:

$name là tên tham số.
$pattern là biểu thức Regular Expression.
Trong ví dụ trên mình muốn id trong ví dụ trên bắt buộc phải là số, còn slug là bất kỳ.

Ví dụ

Route::get('blog/{id}/{slug}', function ($id, $slug) {
    return "Blog id: $id and slug is: $slug";
})->where('id', '[0-9]+');

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

Ví dụ

Route::get('blog/{cat_id}/{id}/{slug}', function ($cat_id, $id, $commentId) {
    return "Cat id: $cat_id and Blog id: $id and slug is: $slug";
})->where(['id' => '[0-9]+', 'cat_id' => '[0-9]+']);

Với định nghĩa route này nếu bạn truyền vào giá trị cat_id hoặc id không phải là số thì route đó sẽ không matching nữa.

Dưới đây là một số các phương thức where kèm với regex phổ biến được Laravel cung cấp sẵn:

  • 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à tên tham số.
$pattern là biểu thức regular expression.
Lúc này tất cả các tham số route đượ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

Ví dụ yêu cầu tất cả các route có tên tham số là id sẽ đều phải là số.

Ví dụ

/**
 * 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ữ, chỉ việc giải quyết các phục thuộc của một object thông qua constructor (chúng ta sẽ nghiên cứu vấn đề này chi tiết ở bài khác).

Trong Laravel thì Dependency injection xuất hiện ở mọi nơi và đương nhiên đối với callback trong route cũng có.

Dependency Request vào route.

Ví dụ

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

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

Ghi chú: Đối với các route có tham số thì 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.

Ví dụ

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

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

3. Đặt tên cho Route.

Trong Laravel có cho phép chúng ta đặt tên cho route để tiện cho việc quản lý và tạo 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.

Ví dụ

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ới phương thức as

Ví dụ

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

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

Với phương thức name.

Ví dụ

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

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

4. Tạo 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 parameter truyền vào route. Nếu route không có parameter đó thì nó sẽ trở thành URL query string.
Một số ví dụ cụ thể

- Sửa file routes/web.php

Ví dụ

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:

Ví dụ

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

Bài viết này đã giúp ích cho bạn?

Advertisements