路由,我们直接参照官网的文档接口,主要涉及2个文件:
app/Http/routes.php // 我们定义的路由
app/Providers/RouteServiceProvider.php // 路由服务,会载入定义的路由文件(上面的routes.php)
基本用法,参考文档。
今天记录的主要目的是:对于整个项目,所有的路由,都写在 'routes.php' 中,文件太大,而且很不清晰。
我们根据业务,按目录来划分路由文件!
分析 RouteServiceProvider.php
public function map(Router $router)
{
/*
很清楚的看到,这里已经使用过 'group' 路由群组了,而且:
namespace = App\Http\Controllers // 这也就是我们在routes.php 直接写 Controllers/ 之后的原因
*/
$router->group(['namespace' => $this->namespace], function ($router) {
require app_path('Http/routes.php');
});
}
开始重构:
1.在app/Http/下,创建 'Routes' 目录
2.自定义方法:
protected function mapCustomWebRoutes(Router $router)
{
$router->group([
'namespace' => $this->namespace, 'middleware' => 'web',
], function ($router) {
$route_files = glob(app_path() . '/Http/Routes/*.php');
foreach($route_files as $filename){
require_once($filename);
}
});
}
3.将我们自定义的方法,添加到 map() 方法中:
public function map(Router $router)
{
$router->group(['namespace' => $this->namespace], function ($router) {
require app_path('Http/routes.php');
});
$this->mapCustomWebRoutes($router);
}
/*
上面的重构,出现了一个问题:
我的验证机制,都记录不到了错误输出!!(折腾了好久!)
*/
各种调试,都不清楚什么原因,确实有错误,考虑session中也生成了错误,但是就是再次进入页面,不显示!这种情况,觉得,只有可能是中间件的问题。
web中间件组,包含了 'ShareErrorsFromSession' 中间件,就是分配错误的!
将拆分出来的路由,重新移入 'routes.php',就可以显示验证错误了!然后查看重构的逻辑,发现:
$router->group([
'namespace' => $this->namespace, 'middleware' => 'web',
/*
这里我为了不让每个文件内部再次写 'web',直接在最外层已经使用了 'web'。然而,我的每个文件内,再次写入了web
google搜索,2次web中间件,可能出现了2次不同的session!,导致认证不了!(可能是这个情况,英文没仔细看,记得好像有类似的意思!)
*/
], function ($router) {
$route_files = glob(app_path() . '/Http/Routes/*.php');
foreach($route_files as $filename){
require_once($filename);
}
});
上述是 5.2 版本的,现在将我们项目的框架升级到了 5.7,仍然使用这种思路,修改了路由:
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
// 自定义 web 路由
$this->mapCustomWebRoutes();
}
/*
自定义引入 'Http/Routes' 下的子路由文件
*/
protected function mapCustomWebRoutes()
{
// 注意,给全局,都已经添加了 'web' 中间件组,内部文件 "一定" 不要再次写入 'web',否则validate验证,不显示错误!!
Route::group(['namespace' => $this->namespace, 'middleware' => 'web'], function ($router) {
/*
参考博客笔记地址:
http://blog.csdn.net/beyond__devil/article/details/78583157
*/
// 临时记录文件系统 'local' 驱动 'root' 配置
$old_root_config = config('filesystems.disks.local.root');
// 修改默认的文件系统 '根路径'
config(['filesystems.disks.local.root' => base_path('routes/web')]);
$route_files = Storage::disk('local')->allFiles();
foreach($route_files as $filename){
// 跳过 mac 下一直生成的 '.DS_Store' 文件
if(strpos($filename, '.DS_Store') !== false){
continue;
}
require_once(base_path('routes/web') . '/' . $filename);
}
// 恢复文件系统 'local' 驱动 'root' 配置
config(['filesystems.disks.local.root' => $old_root_config]);
unset($old_root_config);
});
}