项目需求:
因为项目开发有版本控制。
在tp5的时候,可以通过配置
// 自动搜索控制器
'controller_auto_search' => true
来实现可以通过 version/controller/action 来访问,并且不用每写一个功能都写一个路由
但是,tp6的时候,不存在这样的设置了,在网上搜索了一圈,普遍的
要么通过 version.controller/action 来访问,要么直接修改源码
我感觉还是不满意,捣腾了下,终于解决了:
思路:
本质上就是将 version/controller/action 的请求修改为 version.controller/action
先通过 request()->pathinfo() 来获取原始的请求字符串
一番逻辑修改
最后通过 request()->setPathinfo() 来修改请求字符串
在路由文件的开始,添加以下代码:
/* ------------------------------- version/controller/action 变为 version.controller/action---------------------------*/
$pathInfo = request()->pathinfo();
$pathArr = explode('/', $pathInfo);
if (strpos($pathInfo, 'v') === 0 && strpos($pathInfo, '.') === false) {
$newPathInfo = $pathInfo;
if (count($pathArr) === 2) {
// 包含一个 /
$newPathInfo = $pathArr[0] . '.' . $pathArr[1] . '/index';
}
if (count($pathArr) === 3) {
// 包含两个 /
$newPathInfo = $pathArr[0] . '.' . $pathArr[1] . '/' . $pathArr[2];
}
request()->setPathinfo($newPathInfo);
}
/* ------------------------------- version/controller/action 变为 version.controller/action---------------------------*/
因为我的需求是版本控制,控制器的上一级目录是版本号,如v0001,所以这样判断修改。
这样修改,开启了路由配置后,不用每写一个方法就写一个路由了!并且不影响自定义路由!
示例:
app/api/controller/route/api.php :
pathinfo();
$pathArr = explode('/', $pathInfo);
if (strpos($pathInfo, 'v') === 0 && strpos($pathInfo, '.') === false) {
$newPathInfo = $pathInfo;
if (count($pathArr) === 2) {
// 包含一个 /
$newPathInfo = $pathArr[0] . '.' . $pathArr[1] . '/index';
}
if (count($pathArr) === 3) {
// 包含两个 /
$newPathInfo = $pathArr[0] . '.' . $pathArr[1] . '/' . $pathArr[2];
}
request()->setPathinfo($newPathInfo);
}
/* ------------------------------- version/controller/action 变为 version.controller/action---------------------------*/
Route::group(':version.sys', function () {
Route::get('/list', ':version.sysConfiguration/list');
});
这样:
domain/api/v0001/sys/list
domain/api/v0001.sys/list
domain/api/v0001/sysConfiguration/list
domain/api/v0001.sysConfiguration/list
以上url都可以正常访问!