ThinkPHP6 实现多应用设置默认应用 隐藏默认应用名

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