Thinkphp6绑定应用的个人解决方法

      发布在:后端技术      评论:0 条评论

个人使用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;
}


相关文章
热门推荐