想了解路由的運行原理,可以看《laravel中route路由源碼分析》文章
laravel5.3之后,路由是做了分目錄處理的,分別卸載routes文件中的web.php和api.php中。
但是如果項目比較龐大,這里面的路由會十分多,維護起來比較不方便。
其實laravel已經預留了地方給我們擴展分割路由。
主要文件:app/Providers/RouteServiceProvider.php
在這個文件里面進行處理即可。
一、最簡單快捷的方式
public function map()
{
? ? $this->mapApiRoutes();
? ? $this->mapWebRoutes();
? ? // 在這里開始增加方法。如增加一個user路由,命名為mapWebAdminRoutes,在下面增加一個此方法。
? // $this->mapWebAdminRoutes();
}
//增加mapWebAdminRoutes方法
protected function mapWebAdminRoutes()
{
? ? Route::middleware('web')
? ? ? ? ->namespace($this->namespace)
? ? ? ? ->group(base_path('routes/web_admin.php'));
}
在routes/web_admin.php路徑添加相應的文件即可。
二、自動加載無限級目錄
如果項目足夠大,或者想把項目做到更加理想的擴展,可能還要把路由分文件夾(分組),那就要再擴展更多的內容,具體如下。
1、routes目錄的建立
其實就是分文件夾建立。如需求是在admin中分出user的登錄和注冊相關的路由,就在routes下建立user文件夾,然后分別建立login.php和resgister.php兩個路由文件。
具體目錄結構
routes
? ? --admin
????????--user
? ? ? ? ? ? ---login.php
????????????---resgister.php
二、路由數組列表
$files = [
? ? 'routes/web.php',
? ? 'routes/admin'=>
????[
? ? ? ? ????'login.php',
? ? ? ? ????'resgister.php'
? ? ],
$webRoutes = $this->getBasePath($files); //組合成絕對路徑的函數,如下方法。
????foreach ($webRoutes as $k=>$v){
? ? ????if (file_exists($v)){
? ? ? ????? Route::middleware('web')
? ? ? ? ? ? ????->namespace($this->namespace)
? ? ? ? ? ? ????->group($v);
????}
}
三、組合完整的絕對路徑
/**
* @Name getBasePath
* @Created by yuxuewen.
* @Description 組合完整的絕對路徑的路由列表
* @param array $paths
* @return array
*/
protected function getBasePath(array $paths){
? ? $this->files = [];
? ? $files = $this->merge_file_name($paths);? //調用如下方法來進行遞歸合并
? ? $base_path_files = [];
? ? if (!empty($files)){
? ? ? ? foreach ($files as $k=>$v){
? ? ? ? ? ? $base_path_files[]? = base_path($v);
????????}
????}
? ? return $base_path_files;
}
四、遞歸組合相對路徑
/**
* @Name merge_file_name
* @Created by yuxuewen.
* @Description 遞歸執行數組,組合相對路徑路由列表
* @param array $file_name
* @param string $init_path
* @return array
*/
private $files = []; //預先定義這個數組
protected function merge_file_name(array $file_name, $init_path = ''){
? ? if (!empty($file_name)){
? ? ? ? foreach ($file_name as $k=>$v){
? ? ? ? ? ? if (!is_numeric($k)){
? ? ? ? ? ? ? ? if (!empty($init_path))
? ? ? ? ? ? ? ? ? ? $this->merge_file_name($v, $init_path.'/'.$k);
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? $this->merge_file_name($v, $k);
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? if (empty($init_path))
? ? ? ? ? ? ? ? ? ? $this->files[] = $v;
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? $this->files[] = $init_path.'/'.$v;
}
}
}
? ? return $this->files;
}
分兩種不同的方法提供大家參考,有些地方還考慮得不全,有興趣的朋友幫忙指正。