原创作者:技术达人 | 发布日期:2023年10月
一、ThinkPHP多应用模式深度解析
ThinkPHP 6.0引入的多应用模式为大型项目开发提供了更清晰的代码组织方式。与传统单应用模式相比,多应用模式允许我们在同一个项目中创建多个独立的应用模块,每个应用拥有自己的控制器、模型和视图目录,同时又能共享核心框架代码。
多应用模式的优势:
- 模块化开发:不同业务模块可以独立开发部署
- 代码隔离:应用间代码相互隔离,降低耦合度
- 资源共享:公共组件和库可以在多个应用间共享
- 灵活路由:每个应用可以配置独立的路由规则
二、环境配置与多应用安装
1. 环境要求
PHP >= 7.1.0
Composer
PDO PHP Extension
MBstring PHP Extension
2. 项目创建与多应用配置
首先通过Composer创建ThinkPHP项目:
composer create-project topthink/think tp6-multi-app
cd tp6-multi-app
安装多应用模式扩展:
composer require topthink/think-multi-app
删除app目录,创建多应用结构:
rm -rf app
php think build api
php think build admin
此时项目结构将包含api和admin两个独立应用。
三、项目结构设计与配置
项目目录结构:
tp6-multi-app/
├── app/
│ ├── api/ # API应用
│ │ ├── controller/ # API控制器
│ │ ├── model/ # API模型
│ │ └── middleware/ # API中间件
│ ├── admin/ # 后台管理应用
│ │ ├── controller/ # 后台控制器
│ │ ├── model/ # 后台模型
│ │ └── view/ # 后台视图
│ └── common/ # 公共模块
│ ├── model/ # 公共模型
│ └── service/ # 公共服务
├── config/
├── public/
└── route/
数据库配置(config/database.php):
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'tp6_multi_app',
'username' => 'root',
'password' => '',
'hostport' => '3306',
'charset' => 'utf8mb4',
'prefix' => 'tp_',
],
],
];
四、用户管理API接口开发实战
1. 用户模型设计(app/common/model/User.php)
<?php
namespace appcommonmodel;
use thinkModel;
class User extends Model
{
protected $table = 'tp_users';
protected $pk = 'id';
// 自动时间戳
protected $autoWriteTimestamp = true;
// 字段自动完成
protected $insert = ['status' => 1];
// 密码自动加密
public function setPasswordAttr($value)
{
return password_hash($value, PASSWORD_DEFAULT);
}
// 验证密码
public function verifyPassword($password)
{
return password_verify($password, $this->password);
}
}
2. 用户注册接口(app/api/controller/User.php)
<?php
namespace appapicontroller;
use appcommonmodelUser as UserModel;
use thinkfacadeValidate;
class User
{
public function register()
{
$data = request()->post();
// 数据验证
$validate = Validate::rule([
'username|用户名' => 'require|length:3,20|unique:tp_users',
'email|邮箱' => 'require|email|unique:tp_users',
'password|密码' => 'require|length:6,20',
'mobile|手机号' => 'mobile',
]);
if (!$validate->check($data)) {
return json([
'code' => 400,
'msg' => $validate->getError(),
'data' => null
]);
}
try {
$user = UserModel::create($data);
return json([
'code' => 200,
'msg' => '注册成功',
'data' => [
'user_id' => $user->id,
'username' => $user->username
]
]);
} catch (Exception $e) {
return json([
'code' => 500,
'msg' => '注册失败:' . $e->getMessage(),
'data' => null
]);
}
}
}
3. API路由配置(route/api.php)
<?php
use thinkfacadeRoute;
// 用户相关路由
Route::group('user', function () {
Route::post('register', 'user/register');
Route::post('login', 'user/login');
Route::get('profile', 'user/profile');
})->middleware(['ApiAuth']);
五、JWT身份认证完整实现
1. JWT服务类(app/common/service/JwtAuth.php)
<?php
namespace appcommonservice;
use FirebaseJWTJWT;
use FirebaseJWTKey;
class JwtAuth
{
private static $key = 'your-secret-key';
private static $alg = 'HS256';
public static function createToken($userId, $username)
{
$payload = [
'iss' => 'tp6-api', // 签发者
'aud' => 'api-user', // 接收方
'iat' => time(), // 签发时间
'exp' => time() + 7200, // 过期时间(2小时)
'data' => [
'user_id' => $userId,
'username' => $username
]
];
return JWT::encode($payload, self::$key, self::$alg);
}
public static function verifyToken($token)
{
try {
$decoded = JWT::decode($token, new Key(self::$key, self::$alg));
return (array)$decoded->data;
} catch (Exception $e) {
return false;
}
}
}
2. API认证中间件(app/api/middleware/ApiAuth.php)
<?php
namespace appapimiddleware;
use appcommonserviceJwtAuth;
use thinkfacadeRequest;
class ApiAuth
{
public function handle($request, Closure $next)
{
$token = Request::header('Authorization');
if (!$token) {
return json(['code' => 401, 'msg' => 'Token不存在', 'data' => null]);
}
// 去除Bearer前缀
$token = str_replace('Bearer ', '', $token);
$userInfo = JwtAuth::verifyToken($token);
if (!$userInfo) {
return json(['code' => 401, 'msg' => 'Token无效或已过期', 'data' => null]);
}
// 将用户信息存储到请求对象中
$request->userInfo = $userInfo;
return $next($request);
}
}
六、接口测试与性能优化
1. 使用Postman测试接口
注册接口测试:
- URL: http://localhost/tp6-multi-app/api/user/register
- Method: POST
- Body (JSON):
{ "username": "testuser", "email": "test@example.com", "password": "123456", "mobile": "13800138000" }
2. 性能优化建议
- 数据库优化:为常用查询字段添加索引
- 缓存策略:使用Redis缓存用户信息和频繁查询数据
- API限流:实现接口访问频率限制,防止恶意请求
- SQL监控:开启数据库查询监控,优化慢查询
3. 安全防护措施
- 使用参数绑定防止SQL注入
- 实现XSS过滤和CSRF防护
- 敏感数据脱敏处理
- 接口访问日志记录
总结
通过本教程,我们完整实现了基于ThinkPHP 6.0多应用模式的API接口开发。从环境配置、项目结构设计到具体的用户管理API开发、JWT身份认证实现,再到最后的接口测试和优化,形成了一个完整的开发闭环。
多应用模式为大型项目提供了更好的代码组织和维护性,结合ThinkPHP强大的功能和灵活的扩展机制,可以快速构建稳定、高效的API服务。希望本教程能为您的ThinkPHP开发之路提供有价值的参考。