个人使用Thinkphp6绑定应用访问url生成的链接报错,去掉应用名访问正常,
Thinkphp官方手册说明:自动多应用模式下,路由是每个应用独立的,所以你没法省略URL里面的应用参数。但可以使用域名绑定解决。可是我不省略URL里面的应用报错呀,
难道我只能再准备个域名不成,
没办法看url链接生成函数想到了自己的解决方法:
require __DIR__.'/../vendor/autoload.php';
// 执行HTTP应用并响应
$http = (new App())->http;
//设置应用并说明我已经做了应用绑定
$response = $http->name('admin')->setBind(true)->run();
$response->send();
$http->end($response);
找到文件vendor\topthink\think-multi-app\src\Url.php
修改解析方法:
protected function parseUrl(string $url, &$domain): string
{
$request = $this->app->request;
if (0 === strpos($url, '/')) {
// 直接作为路由地址解析
$url = substr($url, 1);
} elseif (false !== strpos($url, '\\')) {
// 解析到类
$url = ltrim(str_replace('\\', '/', $url), '/');
} elseif (0 === strpos($url, '@')) {
// 解析到控制器
$url = substr($url, 1);
} elseif ('' === $url) {
$url = $this->getAppName() . '/' . $request->controller() . '/' . $request->action();
} else {
// 解析到 应用/控制器/操作
$controller = $request->controller();
$app = $this->getAppName();
$path = explode('/', $url);
$action = array_pop($path);
$controller = empty($path) ? $controller : array_pop($path);
$app = empty($path) ? $app : array_pop($path);
$url = $controller . '/' . $action;
$bind = $this->app->config->get('app.domain_bind', []);
if ($key = array_search($this->app->http->getName(), $bind)) {
isset($bind[$_SERVER['SERVER_NAME']]) && $domain = $_SERVER['SERVER_NAME'];
$domain = is_bool($domain) ? $key : $domain;
} else {
// 如果绑定了应用就不拼接url中的应用名 新增的判断
if(!$this->app->http->isBind()){
$url = $app . '/' . $url;
}
}
}
return $url;
}
相关文章