Quản lý các Laravel route gọn hơn và dễ dàng hơn

3421

Laravel 5.5 cung cấp 4 route file api.phpchannels.phpconsole.php và web.php.

Route web.php dành cho giao diện web, api.php thì cho các API, console.php dành cho việc đăng kí artisan command còn channels.php dành cho mục đích broadcasting.

Chúng ta đều đã biết những thứ này, và chẳng có gì mới mẻ cả !

Bài post giúp được gì?

Nếu bạn đang làm một app nhỏ và không có quá nhiều route để hoàn thiện app thì web.php là đủ. Nhưng nếu như bạn có khoảng hơn 100 routes, ví dụ để dành cho Admin, cho khách hàng, cho các loại user (liên quan đến auth) và các route phổ biến có sẵn cho mọi visitor thì việc giữ tất cả các route với nhau vào 1 route file đơn sẽ khiến bạn không quản lý nổi các route của mình nữa.

Dưới đây là một giải pháp nhanh gọn lẹ dành cho bạn

Giả sử như chúng ta có 3 route :

  1. Cho cấp admin
  2. Cho cấp user [ có thể signup, login, quản lý profile v.v ]
  3. Các public route [ home, blog, contact page v.v ]

Bây giờ chúng ta sẽ tạo 2 thư mục trong routes

Các route directory đã đổi trong laravel 5.5

 routes/web —  các route liên quan đến đường dẫn front-end chẳng hạn

 routes/api— các route liên quan đến API

Chúng ta vẫn để nguyên các route channels.phpconsole.php bên ngoài.

Tạo một file mới như admin.php trong folder web sẽ chứa các route liên quan đến admin.

Tạo user.php trong đó đại diện cho mọi route liên quan đến cấp user.

Phần mẹo tối ưu

Mở Providers/RouteServiceProvider.php—  file này phụ trách khởi tạo tất cả các route của app. Check method map() để hiểu được cách nó nhận diện các route file khác nhau.

Check lại các method mapApiRoutes() và mapWebRoutes(), chúng chỉ trỏ vào đường dẫn mặc định của web.php và api.php tuy nhiên chúng ta đã move nó vào thư mục khác nên vì thế hãy thay đổi lại bằng cách khai báo:

Thay đổi base_path() của 2 method trên

Bây giờ hãy tạo method mới cho admin.php & user.php trong RouteServiceProvider.php
<?php
/**
* Define the admin specific "web" routes for the application.
* These routes all receive session state, CSRF protection, etc.
*
* @return void
*/
protected function mapAdminWebRoutes()
{
    Route::middleware('web')
        ->namespace($this->namespace)
        ->prefix('admin')
        ->group(base_path('routes/web/admin.php'));
}
/**
* Define the user specific "web" routes for the application.
* These routes all receive session state, CSRF protection, etc.
*
* @return void
*/
protected function mapUserWebRoutes()
{
    Route::middleware('web')
        ->namespace($this->namespace)
        ->prefix('user')
        ->group(base_path('routes/web/user.php'));

Tạo các method mới cho cả hai loại route

Hãy xem thử cách chúng tôi set prefix, controller namespace và middleware! Bạn có thể customize chúng trong mỗi app của mình.

Chỉ cần call chúng từ method map() của RouteServiceProvider.

<?php
/**
* Define the routes for the application.
*
* @return void
*/
public function map()
{
    $this->mapApiRoutes();  //for api routes
    $this->mapWebRoutes();  //for our common web routes
    $this->mapAdminWebRoutes();  //for the admin web routes
    $this->mapUserWebRoutes();  //for user web routes
}

Update lần lượt các method map()

Bước cuối cùng

Mở routes/web/user.php và add thêm một số test route

<?php
/*
|--------------------------------------------------------------------------
| Web Routes for user type
|--------------------------------------------------------------------------
|
 */
Route::get('/test', function () {
    return response('this is a test route', 200);
});

Trỏ về your-laravel.dev/user/test và bạn đã hoàn thành rồi.

Vậy là bạn đã tách các route khác nhau của app mình thành công rồi, đơn giản và dễ quản lý.

Tham khảo thêm các vị trí tuyển dụng Laravel lương cao

  Các Laravel route tips giúp bạn cải thiện routing