Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 4: Route trong Laravel 8 (phần 2)

Tiếp tục với route trong Laravel, bài này mình sẽ giới thiệu tiếp với mọi người các tính năng khác liên quan đến route trong Laravel.

1. Truyền tham số  trong route.

Trong Laravel để 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ả:

Route trong laravel 8

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.

Route trong Laravel 8

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 "Xin mời nhập id";
    }

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

Kết quả:

Route trong Laravel

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

VD:

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

Kết quả:

Route trong laravel 8

Trong ví dụ trên bạn có nhập id, commenId là chữ hay số hay là một kí tự đặc biệt nào đó thì route đó vẫn matching.

VD:

Route trong laravel 8

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 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 có 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 đó:

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

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ó parameter các bạn sẽ phải để các tham số dependency phía trước, sau đố các parameter 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]+']);

Nếu bạn chưa hiểu phần này thì cũng đừng lo, mình sẽ giới thiệu chi tiết về nó trong một bài khác.

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à 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ự.

VD: 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');
});

VD: 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 parameter truyền vào route. Nếu route không có parameter đó 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.

Đọc đến đây bạn đã thấy laravel hỗ trợ route rất mạnh đúng không? Nhưng chưa hết đâu, phần sau mình sẽ tiếp tục giới thiệu với mọi người các tính năng khác nữa.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha