laravel路由自動加載

laravel路由自動加載

laravel 自帶的路由文件有四個

  • api.php 文件存放 api 路由,會自動加載api前綴和一些中間件。
  • channels.php 文件用於註冊應用支持的所有事件廣播頻道。
  • console.php 文件用於定義所有基於閉包的控制檯命令,每個閉包都被綁定到一個控制檯命令並且允許與命令行 IO 方法進行交互,儘管這個文件並不定義 HTTP 路由,但是它定義了基於控制檯的應用入口(路由)。
  • web.php 如果應用無需提供無狀態的、RESTful 風格的 API,那麼路由基本上都要定義在 web.php 文件中。會自動加載web中間件。

我們常用的無非是api和web路由,一開始我們可以都寫在裏面,那當程序不斷擴大,路由達到幾千個,幾萬個甚至更多,放在一個文件裏顯示難以維護,難以查找。

這時候我們需要把路由分到不同的路由文件中去,我們在routes目錄下創建api文件夾,來存放相關的api路由。

這時候我們自己創建的路由文件是不被框架認可的,不被加載的。那我們怎麼做呢,最簡單的方法是加載到api.php路由文件內。

<?php

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

require base_path('routes/api/user.php');  //加載api文件夾下的用戶路由

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});



但是這樣的方式有着很大的缺點,難道我們每增加一個路由文件,都要修改這個api.php文件嘛?

我們還有更好的方式,在laravel中,服務提供者是一個很重要的模塊,其實這裏的所有路由都是通過RouteServiceProvider.php這個服務提供者來加載的。所以我們只需要更改這個服務提供者就可以了。

這裏面有一個mapApiRoutes函數來加載api路由,我們可以寫一個函數requireRoutes來加載我們自己創建的路由。然後在mapApiRoutes函數裏面調用。

 /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        Route::prefix('api')     //前綴
            ->middleware('api')  //中間件
            ->namespace($this->namespace)  //命名空間
            ->group(base_path('routes/api.php'));

        $this->requireRoutes('routes/Api');
    }

    /**
     * 遍歷文件夾
     */
    private function requireRoutes($path) {
        $dirs = scandir(base_path($path));
        foreach ($dirs as $dir) {
            if (is_dir(base_path($path.'/'.$dir))) {
                if($dir=='.' || $dir=='..'){//判斷是否爲系統隱藏的文件.和..  如果是則跳過否則就繼續往下走,防止無限循環再這裏。
                    continue;
                }
                $this->requireRoutes($path.'/'.$dir);
            } else {
                //文件,加載進來
                Route::prefix('api')
                ->middleware('api')
                ->middleware('jwtCheck')
                ->namespace($this->namespace)
                ->group(base_path($path.'/'.$dir));
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章