top-think / think-multi-app

thinkphp6 multi app support

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

多应用模式下更换入口文件使用url问题

0377 opened this issue · comments

commented

#9 也是这个问题
例如
访问admin模块 abc.php/index/login.html
login方法里面输出:dump(url('index/login')->build());
对应的结果是:abc.php/admin/index/login.html,这个网址是没法正常访问的
login方法里面输出:dump(url('/index/login')->build()); 或者dump(url('@index/login')->build());是正常的,但是这样感觉不符合使用习惯

parseUrl里面进行应用绑定判断,如果绑定过应用就不加前面的应用,代码修改如下,测试过是可以解决此问题,不知是否影响到其他功能,所以没有PR,只是把代码贴出来了

    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) {
            //判断是否绑定
            if( $this->app->http->isBind() ) {
                $url = $request->controller().'/'.$request->action();
            }else{
                $url = $this->app->http->getName().'/'.$request->controller().'/'.$request->action();
            }
        } else {
            // 解析到 应用/控制器/操作
            $controller = $request->controller();
            $app        = $this->app->http->getName();

            $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($app, $bind)) {
                $domain = is_bool($domain) ? $key : $domain;
            } else {
                //判断是否绑定
                if( !$this->app->http->isBind() ){

                    $map = $this->app->config->get('app.app_map', []);

                    if ($key = array_search($app, $map)) {
                        $url = $key . '/' . $url;
                    } else {
                        $url = $app . '/' . $url;
                    }
                }
            }
        }

哎 木有人修复撒