1. 项目概述
ThinkPHP作为国内流行的PHP开发框架,其8.0版本带来了全新的多应用架构支持。这个架构允许我们在单个项目中创建多个独立应用,共享核心代码的同时保持业务隔离。对于需要开发多个关联业务系统(如前台+后台+API)的场景特别实用。
我最近在电商项目中实践了这套方案,发现相比传统的单应用模式,多应用架构在代码组织、团队协作和部署灵活性上都有明显优势。下面就把从环境准备到部署上线的完整流程梳理出来,包含我踩过的坑和优化技巧。
2. 环境准备与框架安装
2.1 基础环境配置
首先需要确保开发环境满足:
- PHP 7.3+(推荐8.0)
- Composer 2.0+
- MySQL 5.7+/MariaDB
- Nginx/Apache
注意:ThinkPHP8对PHP版本要求严格,使用前务必用
php -v确认版本。我曾在PHP7.2环境折腾半天才发现不兼容。
通过Composer创建项目:
bash复制composer create-project topthink/think tp8-multi-app
2.2 多应用模式启用
默认安装是单应用模式,需要手动开启多应用:
- 修改
config/app.php:
php复制'auto_multi_app' => true,
'app_map' => [],
'domain_bind' => [],
- 创建应用目录结构:
code复制├─app
│ ├─admin # 后台应用
│ ├─api # 接口应用
│ ├─frontend # 前台应用
│ └─... # 其他应用
3. 多应用开发实践
3.1 路由配置技巧
每个应用有自己的路由文件,位于app/[应用名]/route/app.php。分享几个实用配置:
php复制// 后台应用路由示例
Route::group('admin', function(){
Route::rule('login', 'auth/login');
})->middleware(['AdminCheck']);
// 接口应用路由示例
Route::group('api', function(){
Route::get('product/:id', 'product/detail')
->pattern(['id' => '\d+']);
})->allowCrossDomain();
经验:使用路由分组+中间件可以大幅简化权限控制。我在admin组统一添加了权限校验中间件,避免每个路由重复编写。
3.2 共享代码处理
多应用间共享代码的三种方式:
- 公共控制器:放在
app/controller目录 - 公共服务:使用
app/common目录存放 - Composer包:将通用功能打包为内部依赖
推荐做法:
php复制// 在应用A中调用公共控制器
$common = new \app\controller\CommonController;
// 使用公共服务
$service = new \app\common\service\UploadService;
3.3 数据库配置策略
数据库配置支持应用隔离:
php复制// config/database.php
return [
'connections' => [
'admin' => [
'database' => 'db_admin'
],
'api' => [
'database' => 'db_api'
]
]
];
或者在模型内指定:
php复制protected $connection = 'admin';
4. 高级功能实现
4.1 跨应用调用
通过app()函数实现:
php复制// 在admin应用调用api应用的服务
$apiService = app('api')->make('service/ApiService');
4.2 独立配置管理
每个应用可以有自己的配置文件:
code复制app/admin/config/
├─app.php
├─cache.php
└─...
优先级规则:
应用配置 > 全局配置 > 框架默认
4.3 中间件开发
创建应用专属中间件:
php复制namespace app\admin\middleware;
class AdminAuth
{
public function handle($request, \Closure $next)
{
if(!session('admin')){
return redirect('/admin/login');
}
return $next($request);
}
}
5. 部署优化方案
5.1 Nginx配置示例
nginx复制server {
listen 80;
server_name admin.example.com;
root /path/to/tp8-multi-app/public;
location / {
index index.php;
try_files $uri /admin/index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
5.2 性能优化建议
- OPcache配置:
ini复制opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
- 路由缓存:
bash复制php think optimize:route
- 类映射缓存:
bash复制php think optimize:autoload
6. 常见问题解决
6.1 跨应用Session共享
解决方法:
php复制// config/session.php
'prefix' => 'tp_',
'var_session_id' => 'session_id',
6.2 静态资源管理
推荐方案:
- 每个应用使用独立静态目录:
code复制public/static/
├─admin
├─api
└─frontend
- 使用CDN加速:
html复制<script src="https://cdn.example.com/static/admin/js/app.js"></script>
6.3 命令行应用开发
创建命令行应用:
bash复制php think make:command Admin/ResetPassword
调用方式:
bash复制php think admin:reset-password
7. 项目实战技巧
7.1 自动化测试方案
为每个应用创建独立测试套件:
php复制// tests/Admin/LoginTest.php
class LoginTest extends TestCase
{
public function testAdminLogin()
{
$this->post('/admin/login', [
'username' => 'admin',
'password' => '123456'
])->assertOk();
}
}
运行指定应用测试:
bash复制php think test admin
7.2 前端资源构建
推荐使用Vite管理前端资源:
javascript复制// vite.config.js
export default {
build: {
rollupOptions: {
input: {
admin: 'resources/admin/js/app.js',
frontend: 'resources/frontend/js/app.js'
}
}
}
}
7.3 多语言实现
每个应用独立语言包:
code复制app/admin/lang/
├─zh-cn.php
└─en-us.php
调用方式:
php复制// 在admin应用内
lang('admin.login.title');
经过三个月的实际项目验证,这套架构在保持灵活性的同时,确实能显著提升大型项目的可维护性。特别是在团队协作时,不同小组可以专注各自的应用开发,通过规范化的接口进行交互。