+13

Tìm hiểu cách custom(chia nhỏ) Route trong Laravel

Khi code project ta thường chia nhỏ module ra cho dễ quản lí và bảo trì source code sau này. Ví dụ: Trong folder views chia thành 2 folder nhỏ là Admin chứa các file blade cho user có quyền admin (CRUD) và Page chứa các file blade cho user có quyền là user normal hoặc vãng lai.

Trong folder routes cũng chia thành 2 file nhỏ là web.php cho web và api.php cho API. Vậy nếu trong folder này bạn muốn có thêm 1 file admin.php chỉ để phục vụ cho phần điều hướng đến admin thì được không nhỉ? Hoàn toàn được bạn nhé, mời bạn cùng mình tìm hiểu trong bài viết này. 💃 Ok, go.

RouteServiceProvider có gì?

Bạn vào file RouteServiceProvider theo đường dẫn app/Providers/RouteServiceProvider.php và nhìn vào hàm map của class này

public function map()
{
    $this->mapApiRoutes();

    $this->mapWebRoutes();
}

Hàm này có chức năng mapping các file route vào service provider để ta có thể sử dụng được các route đã định nghĩa trong folder routes. Cụ thể nó gọi đến 2 hàm khác là mapApiRoutes dùng để map route từ file api.phpmapWebRoutes từ web.php, cùng xem 2 method đấy có gì.

Hàm mapWebRoutes

protected function mapWebRoutes()
{
    Route::middleware('web')
         ->namespace($this->namespace)
         ->group(base_path('routes/web.php'));
}
  • middleware('web') => Các route được định nghĩa trong web.php sử dụng middleware web.
  • namespace($this->namespace) => với $this->namespace đã được khai báo trong class RouteServiceProvider protected $namespace = 'App\Http\Controllers';, nghĩa là các route được define trong web.php sử dụng namespace App\Http\Controllers.
  • group(base_path('routes/web.php') => Gom nhóm các route trong routes/web.php thành một group.

Tương tự với hàm mapApiRoutes

protected function mapApiRoutes()
{
    Route::prefix('api')
         ->middleware('api')
         ->namespace($this->namespace)
         ->group(base_path('routes/api.php'));
}

Hàm này khác 1 chỗ với mapWebRoutesprefix('api') => Các route được định nghĩa trong api.php đều có prefix là api. Đó là lý do tại sao khi viết API thì ta phải truy cập vào route có prefix api phía trước.

Custom Route

Ok, từ những thứ vừa tìm hiểu ở phía trên thì bây giờ ta thử giải quyết vấn đề đã nêu ra từ đầu bài: Vậy nếu trong folder này bạn muốn có thêm 1 file admin.php chỉ để phục vụ cho phần điều hướng đến admin thì được không nhỉ?

Thứ tự thực hiện gồm:

1. Tạo file routes/admin.php: Bạn tự làm nhé

2. Tạo hàm mapAdminRoutes trong class RouteServiceProvider để map routes có

  • prefix là admin
  • namespace là App\Http\Controllers\Admin
  • Gom nhóm các route từ routes/admin.php

Nó sẽ trông như thế này:

protected function mapAdminRoutes()
{
    Route::prefix('admin')
        ->namespace('App\Http\Controllers\Admin')
        ->group(base_path('routes/admin.php'));
}

Để cho nhanh thì mình làm ntn. Còn trong project nếu muốn thì bạn làm cho quy củ nhá: định nghĩa property namespaceAdmin, middleware...

3. Gọi hàm mapAdminRoutes trong hàm map của class RouteServiceProvider

public function map()
{
    $this->mapApiRoutes();

    $this->mapWebRoutes();

    $this->mapAdminRoutes();
}

Giờ test xem nó đã chạy đúng theo như lý thuyết chưa thôi nào.

4. Test

  • Tạo AdminController.php có namespace là App\Http\Controllers\Admin trong App\Http\Controllers\Admin, định nghĩa hàm index() return ra chuỗi 'Admin Dashboard'.
  • Định nghĩa route trong routes/admin.php call đến hàm index() trong AdminController.php.

AdminController.php

<?php
namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class AdminController extends Controller
{
    public function index()
    {
        return 'Admin Dashboard';
    }
}

routes/admin.php

<?php
Route::get('/', 'AdminController@index');

Giờ chúng ta thử php artisan serve rồi vào http://localhost:8000/admin xem nó như thế nào nhé.

Và đây là kết quả:

Vậy là nó trả ra chuỗi 'Admin Dashboard' từ hàm index() trong AdminController đúng như các bước mình đã làm rồi.

Kết luận

Trên đây mình đã giới thiệu với bạn cách custom Route trong Laravel như thế nào. Hi vọng từ bài viết này bạn áp dụng vào các project thực tế của mình. Nếu có thắc mắc và góp ý bạn comment phía dưới nhé. Cảm ơn bạn 😊

Tham khảo: https://laravel-news.com/laravel-route-tips-to-improve-your-routing


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí