想了解路由的运行原理,可以看《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;
}
分两种不同的方法提供大家参考,有些地方还考虑得不全,有兴趣的朋友帮忙指正。