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));
}
}
}