Coder Social home page Coder Social logo

think-multi-app's People

Contributors

9007967 avatar big-dream avatar liu21st avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

think-multi-app's Issues

多应用模式下 /index.html 无法访问

多应用模式下 /index.html , /admin.html 等带了后缀的不能访问。
在默认处理 pathinfo 的时候没有把 url 后缀去掉,导致生成的应用目录就变成了:
app/index.htmlapp/admin.html,正常应该是 app/indexapp/admin

建议:多入口对应应用的下多目录

现有的方式是index 入口对应index应用,admin入口对应admin应用目录。
image

在构建一个完整应用平台的时候,index(H5页面或PC门户输出),admin(后台管理),api接口管理。按照现有的方式构建平台,需要在每个逻辑上分别在三个应用上添加业务代码。
建议多应用的另外一种模式:入口文件和每个应用下的模块对应,例如:
image
这样的方式能灵活的构建应用,每个应用可以独立部署,整体上维护方便,当需要拆分的时候也能快速把应用剥离出来!
望采纳!

入口文件setNamespace无效

文件 vendor\topthink\think-multi-app\src\MultiApp.php
函数setApp应判断是setNamespace 是否有值

if(empty($this->app->getNamespace())){
    $this->app->setNamespace($this->app->config->get('app.app_namespace') ?: 'app\\' . $appName);
}

这个位置的代码会导致首页不使用自定义路由问题,这个位置判断一下 is_dir 再去 setRoutePath 会比较合理一些

$this->app->http->setRoutePath($this->getRoutePath());

这个位置的代码会导致首页不使用自定义路由问题,这个位置判断一下 is_dir 再去 setRoutePath 会比较合理一些,/ 这个首页路由得去index下创建route目录才能解决。所以应该加个判断,目录存在再去 setRoutePath

没太明白 这个 setAppPath 的用法

          增加了setAppPath方法

Originally posted by @liu21st in #39 (comment)

没太明白这个的用法
或许把 setApp 方法中的

        $appPath = $this->path ?: $this->app->getBasePath() . $appName . DIRECTORY_SEPARATOR;

改为

        $appPath = $this->app->http->getPath() ?: $this->app->getBasePath() . $appName . DIRECTORY_SEPARATOR;

就好

多应用,泛域名支持的问题

建议增加一个泛域名排除的配置,有些场景是需要支持泛域名,又要支持多应用使用同一个域名的情况。比方说A、B、C、D应用都使用“www.domain.com/应用名”访问,E应用是要支持泛域名访问的。

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

#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;
                    }
                }
            }
        }

使用url() 会出现错误

使用助手函数后出现 Declaration of think\app\Url::build() must be compatible with think\route\Url::build(): string 报错

关于runtime路径设置的问题

MultiApp.php 202行 runtime为什么不用初始设置值呢?

$this->app->setRuntimePath($this->app->getRootPath() . 'runtime' . DIRECTORY_SEPARATOR . $appName . DIRECTORY_SEPARATOR);

建议202行改为如下以适应自定义runtime路径的情况

$this->app->setRuntimePath($this->app->getRuntimePath() . DIRECTORY_SEPARATOR . $appName . DIRECTORY_SEPARATOR);

多应用生成url的bug

如题,我在入口文件指定了所执行的应用,访问地址是xxx.com/admin.php
如果我要访问admin应用下的user/index
正常admin.php/user/index.html这样是可以访问的,
但是如果生成URL的话就会变成admin.php/admin/user/index.html
会自动加上应用名这样就会造成访问失败他会定位到admin应用下的admin控制器。
不知道这个是个BUG还是官方刻意为之
我看配置文件里好像给去掉了关闭自动识别多应用了,如果说我想实现一个访问admin应用就必须通过对应的入口问价来进行访问这样该如何实现

多应用模式下,默认应用路由不生效

  • 路由配置开启强制路由模式
  • 路由文件app/home/route/route.php:
<?php

use think\facade\Route;

Route::get('/', 'Index');

Route::get('dd', 'Index/hd');

  • app/home/controller/Index.php文件
<?php

declare(strict_types=1);

namespace app\home\controller;

class Index {
    public function index() {
        return '您好!这是一个[home]示例应用';
    }
    public function hd() {
        return '您好!这是一个[home hd]示例应用';
    }
}

访问URL,http://127.0.0.1:8000 时可以正常访问
但是访问http://127.0.0.1:8000/dd 时,提示路由未定义
image

通过入口文件http://127.0.0.1:8000/home/dd访问正常
image

已使用的项目更新最新版,多应用无效V2

如果你希望某个路由中间件是全局执行(不管路由是否匹配),可以不需要在路由里面定义,支持直接在路由配置文件中定义,例如在config/route.php配置文件中添加:

'middleware' => [
app\middleware\Auth::class,
app\middleware\Check::class,
],

route/api/route.php 目录下

Route::group(function () {
Route::post('login', 'user/login');
})->mergeRuleRegex(false);

问题:1.0.11 正常 1.0.12 无法解析自定义路由地址 中间件获取到路由地址中配置的controller和action,无法获取到 user 控制器login action ,获取的结果是:login/index

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.