由于TP6多应用模式下,默认必须通过/应用名/控制器名/动作名 这种方式进行访问。
在网址中,隐藏了入口文件情况下大致为 http://www.tuesdays.cn/home/article/list
如何隐藏 path 中的默认应用名呢?
经过查看 /vendor/topthink/think-multi-appMultiApp.php 中的源码 parseMultiApp 方法,是通过 pathinfo 获取的信息来区分
所以,只需要写个中间件修改 pathinfo 信息即可。
代码实现
配置:config/app.php
return [ // 默认应用【默认应用的配置,在 middleware 中】 'default_app' => 'defaultApp', // 其他子应用【多应用模式下,必须显示配置其他应用】 'child_app' => [ 'admin' ], ];
中间件实现:app/middleware/SetDefaultApp.php
<?php
declare(strict_types=1);
namespace app\middleware;
class SetDefaultApp
{
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
// 默认应用文件夹名
$default_app = config('app.default_app');
// 其他子应用文件夹名字
$child_app = config('app.child_app');
$path_array = explode('/', $request->pathinfo());
// 循环匹配子应用,如果匹配到了,说明访问的是子应用
foreach ($child_app as $val) {
if (preg_match('/' . $val . '/i', $path_array[0])) {
return $next($request);
}
}
// 没有匹配到,则是访问的默认应用
// 需要 hook 修改 pathinfo 信息,便于 topthink/think-multi-app 包的使用
array_unshift($path_array, $default_app);
// 设置为默认应用
$request->setPathinfo(join('/', $path_array));
return $next($request);
}
}中间件使用:app/middleware.php
<?php //全局中间件定义文件 return [ \app\middleware\SetDefaultApp::class, ];