多应用模式
未知
2023-03-13 21:16:31
0

多应用

安装后默认使用单应用模式部署,目录结构如下:

├─app 应用目录
│  ├─controller         控制器目录
│  ├─model              模型目录
│  ├─view               视图目录
│  └─ ...               更多类库目录
│
├─public                WEB目录(对外访问目录)
│  ├─index.php          入口文件
│  ├─router.php         快速测试文件
│  └─.htaccess          用于apache的重写
│
├─view                  视图目录
├─config                应用配置目录
├─route                 路由定义目录
├─runtime               应用的运行时目录

单应用模式的优势是简单灵活,URL地址完全通过路由可控。配合路由分组功能可以实现类似多应用的灵活机制。

如果要使用多应用模式,你需要cmd指针到thinkphp6根目录使用下面composer命令安装多应用模式扩展think-multi-app

composer require topthink/think-multi-app

然后你的应用目录结构需要做如下调整,主要区别在app目录增加了应用子目录,然后配置文件和路由定义文件都纳入应用目录下。

├─app 应用目录
│  ├─index              主应用
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  ├─config          配置目录
│  │  ├─route           路由目录
│  │  └─ ...            更多类库目录
│  │ 
│  ├─admin              后台应用
│  │  ├─controller      控制器目录
│  │  ├─model           模型目录
│  │  ├─view            视图目录
│  │  ├─config          配置目录
│  │  ├─route           路由目录
│  │  └─ ...            更多类库目录
│
├─public                WEB目录(对外访问目录)
│  ├─admin.php          后台入口文件
│  ├─index.php          入口文件
│  ├─router.php         快速测试文件
│  └─.htaccess          用于apache的重写
│
├─config                全局应用配置目录
├─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->http->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']

多应用模式并非核心内置模式,官方提供的多应用扩展更多是抛砖引玉,你完全可以通过中间件来扩展适合自己的多应用模式

上一篇:入口文件

下一篇:URL访问

相关内容

MySQL变量类型与用途
MySQL支持多种数据类型,包括数值、字符串、日期和时间等类型,以...
2024-11-20 20:23:37
如何使用MySQL变量进行...
本文详细介绍了MySQL中用户定义变量、系统变量和局部变量的使用方...
2024-11-20 18:46:45
云服务器上Kubernet...
本文介绍了在云服务器上搭建Kubernetes集群的实战过程,包括...
2024-11-20 17:00:41
云上Kubernetes集...
摘要:本文详述了云上Kubernetes集群的部署流程及优化策略,...
2024-11-20 14:46:37
拼多多购物优惠券,折扣享不...
拼多多购物优惠券丰富多样,可享折扣优惠。多种优惠券类型与获取方式,...
2024-11-20 13:58:10
京东优惠券领不停,优惠不停...
京东优惠券多样实用,领取便捷,可降低购物成本,并可分享给亲友。优惠...
2024-11-20 12:46:36

热门资讯

tp6开发规范 命名规范 请理解并尽量遵循以下命名规范,可以减少在开发过程中出现不必要的错误。 ThinkPHP6....
6高级查询 快捷查询 快捷查询方式是 一种多字段相同查询条件 的简化写法,可以进一步简化查询条件的写法,在多个字...
tp6多应用提示控制器不存在:... 第一个情况是没有使用composer安装扩展。 如果要使用多应用模式, 你需要win+r,cmd指针...
6配置 配置目录 单应用模式 对于单应用模式来说,配置文件和目录很简单,根目录下的 config 目录下面就...
6异常处理 和PHP默认的异常处理不同,ThinkPHP抛出的不是单纯的错误信息,而是一个人性化的错误页面。 异...
6swoole 本篇内容主要讲述了最新的 think-swoole 扩展的使用。目前仅支持Linux环境或者MacO...
6助手函数 助手函数 系统为一些常用的操作方法封装了助手函数,便于使用,包含如下: 助手函数 描述 abort ...
6查询表达式 查询表达式 查询表达式支持大部分的SQL查询语法,也是 ThinkPHP 查询语言的精髓,查询表达式...
6路由参数 路由参数 路由分组及规则定义支持指定路由参数,这些参数主要完成路由匹配检测以及后续行为。 路由参数可...
6查询 模型查询和数据库查询方法的区别主要在于,模型中的查询的数据在获取的时候会经过获取器的处理,以及更加对...