top-think / think-multi-app Goto Github PK
View Code? Open in Web Editor NEWthinkphp6 multi app support
License: Apache License 2.0
thinkphp6 multi app support
License: Apache License 2.0
v1.0.14
更新后 url 不能识别 app_map 绑定
多应用模式下 /index.html , /admin.html 等带了后缀的不能访问。
在默认处理 pathinfo 的时候没有把 url 后缀去掉,导致生成的应用目录就变成了:
app/index.html
或 app/admin.html
,正常应该是 app/index
或 app/admin
文件 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);
}
多应用模式强制路由在php think run 可以找到路由,用think-swoole运行就找不到路由
自定义路由时vendor/topthink/think-multi-app/src/MultiApp.php
的parseMultiApp()
方法无法解析对应的模块名, 导致一些与模块相关的信息无法进行加载
更新1.0.12
控制器不存在:app\controller\Index
恢复1.0.11 正常
016cc47 提交的代码,有严重的bug。输出日志时会产生循环嵌套目录,直到服务无法正常运行。
think-multi-app/src/MultiApp.php
Line 203 in a997f2b
这个位置的代码会导致首页不使用自定义路由问题,这个位置判断一下 is_dir 再去 setRoutePath 会比较合理一些,/ 这个首页路由得去index下创建route目录才能解决。所以应该加个判断,目录存在再去 setRoutePath
升级 v1.0.12 路由不起作用了
退回 v1.0.11 没问题
dd($this->request);
$routeName = $this->request->rule()->getName();
$routeName = explode('@', $routeName);
$controllerName = $routeName[0];
$actionName = $routeName[1];
dump($controllerName, $actionName);
增加了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应用是要支持泛域名访问的。
#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;
}
}
}
}
使用助手函数后出现 Declaration of think\app\Url::build() must be compatible with think\route\Url::build(): string 报错
think-swoole 多应用不支持
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);
自行修改 MultiApp的107行 explode以 $this->app->config->get('route.pathinfo_depr') 去分割可以。是否有其他方法?
$name = current(explode('/', $path));
如题,我在入口文件指定了所执行的应用,访问地址是xxx.com/admin.php
如果我要访问admin应用下的user/index
正常admin.php/user/index.html这样是可以访问的,
但是如果生成URL的话就会变成admin.php/admin/user/index.html
会自动加上应用名这样就会造成访问失败他会定位到admin应用下的admin控制器。
不知道这个是个BUG还是官方刻意为之
我看配置文件里好像给去掉了关闭自动识别多应用了,如果说我想实现一个访问admin应用就必须通过对应的入口问价来进行访问这样该如何实现
<?php
use think\facade\Route;
Route::get('/', 'Index');
Route::get('dd', 'Index/hd');
<?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 时,提示路由未定义
如果你希望某个路由中间件是全局执行(不管路由是否匹配),可以不需要在路由里面定义,支持直接在路由配置文件中定义,例如在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
think-multi-app/src/MultiApp.php
Line 242 in a997f2b
这里有错误 望修正下
$this->app->loadLangPack($this->app->lang->getLangSet());
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.