网络知识 娱乐 ThinkPHP6多应用模式配置经验总结

ThinkPHP6多应用模式配置经验总结

1、安装ThinkPHP6

6.0之前安装都是从Git或者直接下载安装包进行安装,从6.0开始安装方式就改成了composer进行安装了,安装命令如下:

稳定版:composer create-project topthink/think tp
开发版:composer create-project topthink/think=6.0.x-dev tp

        默认安装完成之后是单应用模式,目录结构如下:

www  WEB部署目录(或者子目录)
├─app           应用目录
│  ├─controller      控制器目录
│  ├─model           模型目录
│  ├─ ...            更多类库目录
│  │
│  ├─common.php         公共函数文件
│  └─event.php          事件定义文件
│
├─config                配置目录
│  ├─app.php            应用配置
│  ├─cache.php          缓存配置
│  ├─console.php        控制台配置
│  ├─cookie.php         Cookie配置
│  ├─database.php       数据库配置
│  ├─filesystem.php     文件磁盘配置
│  ├─lang.php           多语言配置
│  ├─log.php            日志配置
│  ├─middleware.php     中间件配置
│  ├─route.php          URL和路由配置
│  ├─session.php        Session配置
│  ├─trace.php          Trace配置
│  └─view.php           视图配置
│
├─view            视图目录
├─route                 路由定义目录
│  ├─route.php          路由定义文件
│  └─ ...   
│
├─public                WEB目录(对外访问目录)
│  ├─index.php          入口文件
│  ├─router.php         快速测试文件
│  └─.htaccess          用于apache的重写
│
├─extend                扩展类库目录
├─runtime               应用的运行时目录(可写,可定制)
├─vendor                Composer类库目录
├─.example.env          环境变量示例文件
├─composer.json         composer 定义文件
├─LICENSE.txt           授权说明文件
├─README.md             README 文件
├─think                 命令行入口文件

单应用模式很简单,直接使用就可以了,我们现在需要的是多应用模式,多应用模式和单应用模式区别就在app目录结构,下面我们来一步一步实现。

2、配置多应用模式

  1.         安装多应用模式扩展think-multi-app
    composer require topthink/think-multi-app
  2.         删除app目录下的controller文件夹,TP是根据是否有这个文件夹来判断单应用模式还是多应用模式的,所以这个必须删除。
  3. 删除完成之后使用命令创建的 ,比如要创建admin和api两个应用
    php think build admin
    php think build api

    这里有一个坑,很多人会遇到这种情况

    [InvalidArgumentException]
    Command "build" is not defined.

    提示“build”命令没有定义,这个坑折腾了我近一个小时,之前的think是提供的有默认build命令的,现在不知道为啥没有了,需要手工去配置进去,最终的解决办法就是修改config/console.php,添加build命令

    return [
        // 指令定义
        'commands' => [
            'build' => thinkappcommandBuild::class,
        ],
    ];

    再次执行build命令就会提示success成功了。这个时候项目目录结构大概如下

    www  WEB部署目录(或者子目录)
    ├─app           应用目录
    │  ├─admin
    │  │  ├─controller      控制器目录
    │  │  ├─model           模型目录
    │  │  ├─ ...            更多类库目录
    │  │  │
    │  │  ├─common.php         公共函数文件
    │  │  └─event.php          事件定义文件
    │  │
    │  ├─api
    │  │  ├─controller      控制器目录
    │  │  ├─model           模型目录
    │  │  ├─ ...            更多类库目录
    │  │  │
    │  │  ├─common.php         公共函数文件
    │  │  └─event.php          事件定义文件
    │  │
    ├─config                配置目录
    │  ├─app.php            应用配置
    │  ├─cache.php          缓存配置
    │  ├─console.php        控制台配置
    │  ├─cookie.php         Cookie配置
    │  ├─database.php       数据库配置
    │  ├─filesystem.php     文件磁盘配置
    │  ├─lang.php           多语言配置
    │  ├─log.php            日志配置
    │  ├─middleware.php     中间件配置
    │  ├─route.php          URL和路由配置
    │  ├─session.php        Session配置
    │  ├─trace.php          Trace配置
    │  └─view.php           视图配置
    │
    ├─view            视图目录
    ├─route                 路由定义目录
    │  ├─route.php          路由定义文件
    │  └─ ...   
    │
    ├─public                WEB目录(对外访问目录)
    │  ├─index.php          入口文件
    │  ├─router.php         快速测试文件
    │  └─.htaccess          用于apache的重写
    │
    ├─extend                扩展类库目录
    ├─runtime               应用的运行时目录(可写,可定制)
    ├─vendor                Composer类库目录
    ├─.example.env          环境变量示例文件
    ├─composer.json         composer 定义文件
    ├─LICENSE.txt           授权说明文件
    ├─README.md             README 文件
    ├─think                 命令行入口文件



    接下来就是测试多应用模式,理论上输入www.xxxxx.com/index.php/admin应该是会调起admin应用下的Index/index方法的,但是并没有,又一个坑出现了,这个也是大坑!

    还是按照单应用模式去执行了,网上的说法很多,有说是在config/app.php下加入'auto_multi_app' => true,有说要配置app_map=>['admin'=>'admin','api'=>'api'],也有说配置domain_bind=>['admin'=>'admin','api'=>'api'],但是这些统统都被我验证失败了,芭比Q了。
    搜索的过程中突然,一个新的方法出现在我的眼前,不管行不行,必须得试试,也没其他办法了,果然是一个大神,接下来就是这问大神的方法。

  4. 说的是服务没有自动注册成功,操作步骤如下:
    打开vendor/composer/installed.json,查找“services” 关键字,我这边查到两条

    "services": [
          "think\app\Service"
     ]
    "services": [
         "think\trace\Service"
     ],

    把搜索到的所有值写入vendor/services.php文件,内容如下

     'think\app\Service',
        1 => 'think\trace\Service',
    );

    再次执行www.xxxxx.com/index.php/admin

    您好!这是一个[admin]示例应用

    再次执行www.xxxxx.com/index.php/api

    您好!这是一个[api]示例应用

         至此多应用模式已经配置完毕了。

可能有人会感觉执行的url地址里都带一个index.php太烦人,不想带它能不能去掉,肯定是可以的,修改public/.htaccess文件为如下


  Options +FollowSymlinks -Multiviews
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  #RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
  RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]

执行地址即可简化为www.xxxxx.com/admin,跟www.xxxxx.com/index.php/admin是一样的结果。

有人可能又有疑问了,现在都是用的二级域名比较多,

www.xxxxx.com/admin能不能简化为admin.xxxx.com

www.xxxxx.com/api能不能简化为api.xxxx.com

答案毋庸置疑,肯定是能的,这个时候就用到了前面说的domain_bind=>['admin'=>'admin','api'=>'api']了,这个是域名绑定的,可以是二级域名前缀,也可以是全域名。

app_map这个没用,这个是应用的映射,跟这个二级域名没有关系。

好了,所有的需求都得到了解决,分享给有同样问题的小伙伴们,有不对的地方希望指正,谢谢。