tp6多级控制器路由优化

项目需求:

因为项目开发有版本控制。

在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都可以正常访问!

你可能感兴趣的:(php,web开发,thinkphp,thinkphp6,tp6)