ThinkPHP框架多APP以及域名绑定

 

多应用安装

注意只能用composer 2.0或者更新的版本请求安装.

composer require topthink/think-multi-app

 

新建应用

新建一个admin应用和api应用.会自动生成对应的目录和基本文件.

php think build admin

php think build api

 

绑定域名

 

解析

推荐使用泛域名解析.比如我网站配置如下.

Caddy2服务器伪静态

 

TP配置

 

实际上一个应用可以绑定多个域名.

比如 admin.getce.cn 和 lv.getce.cn  同时绑定了admin应用.

lv这个子域只有网站开启了调试的时候才绑定.

这种调试专用的域名是本地hosts文件中手动绑定的.

用于本地调试.本地测试没问题在上线.

 

 

config/app.php

$bind_arr = [
    'api'=>'api',
    'login'=>'login',
    'admin'=>'admin',
    'user'=>'user',
    'cheat'=>'cheat',
];

if ( !ENV('APP_DEBUG',false) ){
    $bind_arr['*'] ='blog';
}else{
    $bind_arr['lv'] = 'admin';
    $bind_arr['testapi'] = 'api';
    $bind_arr['testuser'] = 'user';
    $bind_arr['testlogin'] = 'login';
    $bind_arr['testcheat'] = 'cheat';
}




return [

    // 是否启用路由
    'with_route'       => true,

    // 默认应用
    'default_app'      => 'blog',


    // 应用映射(自动多应用模式有效)
    'app_map'          => [],
    // 域名绑定(自动多应用模式有效)
    'domain_bind'      => $bind_arr,
    // 禁止URL访问的应用列表(自动多应用模式有效)
    'deny_app_list'    => ['common'],

    // 开启应用快速访问 如果你完全不需要单应用模式,也可以设置使用严格的多应用模式
    'app_express'    => true,


    //多应用
    'auto_multi_app' => true,


];

 

路由

多应用的是多应用自己设置的.

 

在应用目录新建一个route的目录

里面新建一个和应用同名的php文件

比如api应用就新建一个app/api/route/api.php

 

<?php
use think\facade\Route;


Route::get('/', function () {
    return 'api服务器.';
});

//也可以用路由群组

//版本号
Route::group(':version',function (){
    Route::group('user',function(){
        Route::GET('getapi', ':version.user.User/getApi');
        Route::GET('readall', ':version.user.User/readAll');
        Route::GET('readmessage', ':version.user.User/readMessage')
            ->pattern(['blogid' => '\d+']);
    });
})->allowCrossDomain();

 

 

中间件

全局中间件和应用自己的

 

全局的:

app/middleware.php

我开了全站session和CORS

<?php
// 全局中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    // \think\middleware\LoadLangPack::class,
    // Session初始化
    \think\middleware\SessionInit::class,
    \think\middleware\AllowCrossDomain::class
];

 

应用自己的:

app/api/middleware.php

API鉴权用的,自己写的.

一般的应用不需要另外的中间件.

<?php

return [
    \app\common\middleware\ApiCheck::class
];