系统多应用模式
系统多应用模式
系统多应用模式
多应用
默认安装后使用单应用模式部署,目录结构如下:
├─app 应用目录
│ ├─controller 控制器目录
│ ├─model 模型目录
│ ├─view 视图目录
│ └─ ... 更多类库目录
│ ├─public WEB目录(对外访问目录)
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
│ ├─view 视图目录
├─config 应用配置目录
├─route 路由定义目录
├─runtime 应用的运行时目录
单应用模式的优势是简单灵活,URL地址完全通过路由可控。配合路由分组功能可以实现类似多应用的灵活机制。
如果要使用多应用模式,你需要安装多应用模式扩展think-multi-app。
composer require topthink/think-multi-app
然后你的应用目录结构需要做如下调整(主要区别在app目录)。
├─app 应用目录
│ ├─index 主应用
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ ├─config 配置目录(优先)
│ │ └─ ... 更多类库目录
│ ├─admin 后台应用
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ ├─config 配置目录(优先)
│ │ └─ ... 更多类库目录
│ ├─public WEB目录(对外访问目录)
│ ├─admin.php 后台入口文件
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
│ ├─config 应用配置目录
│ ├─index index应用配置
│ └─admin admin应用配置
│ ├─view 视图目录
│ ├─index index应用视图目录
│ └─admin admin应用视图目录
│ ├─route 路由定义目录
│ ├─index index应用路由定义目录
│ └─admin admin应用路由定义目录
│ ├─runtime 运行时目录
│ ├─index index应用运行时目录
│ └─admin admin应用运行时目录
从目录结构可以看出来,每个应用相对保持独立,并且可以支持多个入口文件,应用下面还可以通过多级控制器来维护控制器分组。
自动多应用部署
支持在同一个入口文件中访问多个应用,并且支持应用的映射关系以及自定义。如果你通过index.php入口文件访问的话,并且没有设置应用name,系统自动采用自动多应用模式。
自动多应用模式的URL地址默认使用
// 访问admin应用 http://serverName/index.php/admin // 访问shop应用 http://serverName/index.php/shop
也就是说pathinfo地址的第一个参数就表示当前的应用名,后面才是该应用的路由或者控制器/操作。
如果直接访问
http://serverName/index.php
访问的其实是index默认应用,可以通过app.php配置文件的default_app配置参数指定默认应用。
// 设置默认应用名称 'default_app' => 'home',
接着访问
http://serverName/index.php
其实访问的是home应用。
自动多应用模式下,路由是每个应用独立的,所以你没法省略URL里面的应用参数。但可以使用域名绑定解决。
多应用智能识别
如果没有绑定入口或者域名的情况下,URL里面的应用不存在,例如访问:
http://serverName/index.php/think
假设并不存在think应用,这个时候系统会自动切换到单应用模式,如果有定义全局的路由,也会进行路由匹配检查。
如果我们在route/route.php全局路由中定义了:
Route::get('think', function () { return 'hello,ThinkPHP!'; });
访问上面的URL就会输出
hello,ThinkPHP!
如果你希望think应用不存在的时候,直接访问默认应用的路由,可以在app.php中配置
// 开启应用快速访问 'app_express' => true, // 默认应用 'default_app' => 'home',
这个时候就会访问home应用下的路由。
增加应用入口
允许为每个应用创建单独的入口文件而不通过index.php入口文件访问多个应用,例如创建一个admin.php入口文件来访问admin应用。
// [ 应用入口文件 ] namespace think; require __DIR__ . '/../vendor/autoload.php'; // 执行HTTP应用并响应 $http = (new App())->http; $response = $http->run(); $response->send(); $http->end($response);
多应用使用不同的入口的情况下,每个入口文件的内容都是一样的,默认入口文件名(不含后缀)就是应用名。
使用下面的方式访问admin应用
http://serverName/admin.php
如果你的入口文件名和应用不一致,例如你的后台admin应用,入口文件名使用了test.php,那么入口文件需要改成:
// [ 应用入口文件 ] namespace think; require __DIR__ . '/../vendor/autoload.php'; // 执行HTTP应用并响应 $http = (new App())->http; $response = $http->name('admin')->run(); $response->send(); $http->end($response);
获取当前应用
如果需要获取当前的应用名,可以使用
app('http')->getName();
应用目录获取
单应用和多应用模式会影响一些系统路径的值,为了更好的理解本手册的内容,你可能需要理解下面几个系统路径所表示的位置。
目录位置 |
目录说明 |
获取方法(助手函数) |
根目录 | 项目所在的目录,默认自动获取,可以在入口文件实例化App类的时候传入。 | root_path() |
基础目录 |
根目录下的app目录 | base_path() |
应用目录 | 当前应用所在的目录,如果是单应用模式则同基础目录,如果是多应用模式,则是app/应用子目录 | app_path() |
配置目录 | 根目录下的config目录 | config_path() |
运行时目录 | 框架运行时的目录,单应用模式就是根目录的runtime目录,多应用模式为runtime/应用子目录 | runtime_path() |
注意:应用支持使用composer包,这个时候目录可能是composer包的类库所在目录。
对于非自动多应用部署的情况,如果要加载composer应用,需要在入口文件中设置应用路径:
// [ 应用入口文件 ] namespace think; require __DIR__ . '/../vendor/autoload.php'; // 执行HTTP应用并响应 $http = (new App())->http; $response = $http->path('path/to/app')->run(); $response->send(); $http->end($response);
应用映射
自动多应用模式下,支持应用的别名映射,例如:
'app_map' => [ 'think' => 'admin', // 把admin应用映射为think ],
应用映射后,原来的应用名将不能被访问,例如上面的admin应用不能直接访问,只能通过think应用访问。
应用映射支持泛解析,例如:
'app_map' => [ 'think' => 'admin', 'home' => 'index', '*' => 'index', ],
表示如果URL访问的应用不在当前设置的映射里面,则自动映射为index应用。
如果要使用composer加载应用,需要设置
'app_map' => [ 'think' => function($app) { $app->path('path/to/composer/app'); }, ],
域名绑定应用
如果你的多应用使用多个子域名或者独立域名访问,你可以在config/app.php配置文件中定义域名和应用的绑定。
'domain_bind' => [ 'blog' => 'blog', // blog子域名绑定到blog应用 'shop.tp.com' => 'shop', // 完整域名绑定 '*' => 'home', // 二级泛域名绑定到home应用 ],
禁止应用访问
你如果不希望某个应用通过URL访问,例如,你增加了一个common子目录用于放置一些公共类库,你可以设置
'deny_app_list' => ['common']
推荐阅读
-
企业资源规划系统应用架构图 企业资源规划系统软件
-
PACS 系统中的三维重建技术:原理、实施和应用
-
暹罗订餐开源,一个java多店订餐系统--冰城蜜雪瑞幸咖啡等连锁店
-
暹罗外卖开源,一个 java 多商户外卖系统--入驻商户如美团饿了么等
-
暹罗订餐开源,一个java多店订餐系统--冰城蜜雪瑞幸咖啡等连锁店
-
.NET框架设计和实施说明6.5 - ASP.NET Core应用程序的多种运行模式V - Kestrel的其他说明
-
利用 Gradio 的热重载模式快速开发人工智能应用程序
-
全知识系统程序详细设计库模式:"三重诞生"(衍生自生)(智能问答)
-
使用 winzip 生成的扩展名为 -ZIP 的压缩文件通常使用".zip "扩展名,其 MIME 格式为 application/zip。(推荐学习:phpstorm) 目前,ZIP 格式属于几种主流压缩格式之一,其竞争对手包括 RAR 格式和开源的 7z 格式。 从性能对比来看,RAR 和 7z 格式比 ZIP 格式压缩率更高,而 7-Zip 由于提供免费压缩工具而逐渐在更多领域得到应用。 微软从 Windows ME 操作系统开始就内置了对 zip 格式的支持,即使用户没有在电脑上安装解压软件,也可以打开和创建 zip 格式的压缩文件,OS X 和流行的 Linux 操作系统也提供了类似的 zip 格式支持。 因此,如果要在网络上传播和分发文件,zip 格式往往是最常见的选择。
-
谈谈设计模式在实践中的应用