由于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, ];