Giap Hiep

I'm Giap Hiep

I'm a web developer, a gymer. I enjoy share something i know that help people's work!
Giap Hiep

Tìm hiểu về Route trong Laravel

Chào các bạn, chắc hẳn nếu các bạn đã từng tìm hiểu về các web framework thì Route chảng có gì là xa lạ. Nhiệm vụ của Route là định tuyến request của người đến controller cụ thể. Để định nghĩa route trong Laravel chúng ta sẽ mở file routes/web.php và viết như sau:

Route::get('/test', function () {
    for ($i = 0; $i <= 5; $i++) {
        echo $i . '</br>';
    }
});

Bây giờ các bạn hãy vào http://127.0.0.1:8000/test để xem kết quả nhé :+1: :+1: .
Trong bài viết này mình sẽ hướng dẫn các bạn cơ bản về Route trong Laravel framework như sau:

  • Basic Routing
  • Route Parameters
  • Route Filters
  • Named Routes
  • Route Groups
  • Route Prefix

Basic Routing

Trong Laravel cung cấp một cách định nghĩa route có cấu trúc rất đơn giản như sau:

Route::<method>('<URI>', <callback function>)
  • <method>: Các phương thức cơ bản như post, get, put, delete, any.
  • <URI>: Đường dẫn route.
  • <callback function>: Hành động nào đó sẽ được thực hiện.
    Nhưng làm thế nào để Laravel biết được bạn muốn điều hướng đến một action cụ thể nào đó trong một controller? :thinking: :thinking: Ví dụ dưới đây là cách để chúng ta chỉ ra cho Laravel thực hiện điều này. :astonished: :astonished:
Route::get('/home', 'HomeController@index');

Điều này có nghĩa là nó sẽ đi tìm trong controller là HomeController và gọi phương thức có tên index dựa trên phương thức get mà chúng ta đã định nghĩa như trên. Bây giờ nếu các bạn truy cập vào đường dẫn http://127.0.0.1:8000/home thì nó sẽ luôn luôn gọi đến action index trong HomeController :+1: :+1:.

Route Parameters

Bây giờ các bạn muốn truyền các tham số cho action thì các bạn chỉ cần cung cấp các tham số cho route và trong callback hay action chúng ta sẽ sử dụng nó như một tham số được truyền vào.

  1. Với callback function:
Route::get('/products/{id}', function ($id) {
    echo 'Product ID=' . $id;
});

Các bạn hãy vào trình duyệt với link như sau http://127.0.0.1:8000/products/3
Kết quả các bạn sẽ thấy trên trình duyệt :100::100::

Product ID=3
  1. Với action trong controller:
  • Trong routes/web.php:
Route::get('/products/{id}', 'ProductController@show');
  • Trong ProductController.php:
public function show($id)
{
    return 'Product ID=' . $id;
}

Các bạn hãy vào trình duyệt với link như sau http://127.0.0.1:8000/products/3
Kết quả các bạn sẽ thấy trên trình duyệt tương tự với cách truyền vào với callback function :100::100: :

Product ID=3

Điều này có nghĩa là khi bạn cung cấp cho route bất kì một tham số nào thì trong callback hay action chúng ta đều có thể sử dụng như một tham số hoàn toàn bình thường.
Các bạn còn có thể kiểm tra kiểu dữ liệu của tham số bằng cách sử dụng hàm where() VD:

Route::get('/products/{id}', 'ProductController@show')->where('id', '[0-9]+');

Route Filters

Trong trường hợp bạn muốn thực hiện việc kiểm tra một diều kiện trước khi được phép truy cập vào route nào đó, chảng hạn như bạn muốn kiểm tra người dùng đã login hay chưa hay chảng hạn như bạn là chủ sở hữu một thẩm mỹ viện :open_mouth::open_mouth: bây giờ bạn muốn khi người dùng vào trang của bạn và đi đến một trang chỉ duy nhất dành riêng cho ngày 20/10 :+1: còn các ngày khác sẽ không được phép truy cập thì lúc này Route Filters sẽ rất có hữu ích.

Route::filter('<filter name>', <callback function>);

ví dụ cho trường hợp kiểm tra người dùng đã login hay chưa:

Route::filter("checkLogin", function(){
  if (Auth::check()){
    return redirect()->route('login')
  }
});

ví dụ cho trường hợp kiểm tra hôm nay có phải là ngày 20/10:

Route::filter("checkWomanDay", function(){
  if (!Carbon::parse('2019/10/20')->isCurrentDay()){
    return redirect()->route('index')
  }
});

Bây giờ để sử dụng Route Filters trên cho một route nào đó thì mình sẽ làm như sau :+1::

Route::get('/promo-woman-day', 
  [
    'before' => 'checkWomanDay', 
    'uses' => 'HomeController@show'
  ]
);

Named Routes

Đây là cách để đặt tên cho một route giúp chúng ta có thể dễ dàng hơn trong việc gọi route chúng ta cần. Để làm được điều này chúng ta sử dụng hàm name() như ví dụ dưới đây:

Route::get('/products/{id}', 'HomeController@show')
    ->where('id', '[0-9]+')
    ->name('products.show');

Để thấy phần tên đã được gán cho route hay chưa các bạn mở terminal cd vào thư mục dự án gõ php artisan route:list các bạn sẽ thấy phần tên sẽ được thể hiện ở cột Name như sau:

+--------+-------------------+-----------------------------------------+-----------------------------------+-------------------------------------------------------+--------------+
| Domain | Method            | URI                                     | Name                              | Action                                                | Middleware   |
+--------+-------------------+-----------------------------------------+-----------------------------------+-------------------------------------------------------+--------------+
|        | GET|HEAD          | products/{id}                           | products.show                     | LOL\Http\Controllers\HomeController@show              | web          |
+--------+-------------------+-----------------------------------------+-----------------------------------+-------------------------------------------------------+--------------+

OK, để sử dụng route products.show trong các view blade chúng ta chỉ cần gọi như sau {{ route('products.show', 100) }} :100:, VD:

<a href="{{ route('products.show', 100) }}">Product Detail</a>

Route Groups

Trường hợp các bạn muốn nhóm các route lại với nhau với nhiều route có chung một đặc điểm gì đó mà bạn muốn đưa chúng vào một nhóm để kiểm tra các route này có đủ điều kiện để truy cập hay không thì chúng ta sẽ sử dụng Route Groups, ví dụ như dưới đây là sẽ kiểm tra người dùng đã login hay chưa trước khi được phép truy cập, ở ví dụ dưới mình lại sử dụng lại cái filter đã được định nghĩa ở phần Route Filters bên trên nhé :grinning::grinning::

Route::group(array('before' => 'checkLogin'), function(){
     Route::get('/products/{id}', 'ProductController@show')->where('id', '[0-9]+')->name('products.show');
     Route::post('products/store', 'ProductController@store')->name('products.store');
});

Route Prefix

Giả sử rằng các bạn muốn thêm tiền tố là admin cho một nhóm các routes như này:

http://127.0.0.1:8000/admin/login
http://127.0.0.1:8000/admin/dasboard
http://127.0.0.1:8000/admin/products

chúng ta sẽ không đi viết từng từ admin trước mỗi route :scream::scream: mà trong Laravel nó đã hỗ trợ sẵn cho chúng ta làm điều này, để thiết lập cho một nhóm các routes chứa các tiền tố là admin như trên thì các bạn sẽ dùng đến Route Prefix, mình sẽ làm một ví dụ như bên dưới :open_mouth::open_mouth::

Route::group(['prefix' => 'admin'], function(){
   Route::get('/login', 'AuthController@login')->name('auth.login');
   Route::get('/dasboard', 'HomeController@index')->name('home.dasboard');
   Route::get('/products', 'ProductController@index')->name('products.index');
});

Kết Luận

Trên đây là những kiến thức cơ bản về route trong Laravel, thực tế là route trong laravel nó còn có nhiều điều thú vị khác như resource, any, match... Mong rằng bài viết này có thể giúp bạn hiểu hơn về cách sử dụng route cơ bản trong Laravel

Tham khảo