引言:ThinkPHP 6.0的新特性
ThinkPHP 6.0作为国内最流行的PHP框架之一,在API开发方面提供了强大的支持。新版本引入了中间件增强、依赖注入改进、更好的ORM支持等特性,使得开发高性能API变得更加高效。本文将带你从零开始,使用ThinkPHP 6.0构建一个完整的RESTful API项目。
1. 环境准备与项目创建
1.1 环境要求
- PHP >= 7.1.0
- Composer包管理工具
- PDO PHP Extension
- MySQL 5.7+
1.2 创建ThinkPHP项目
# 使用Composer创建项目
composer create-project topthink/think tp6-api
# 进入项目目录
cd tp6-api
# 启动内置服务器进行测试
php think run
访问 http://localhost:8000 可以看到欢迎页面,说明安装成功。
2. 项目结构与配置
2.1 目录结构说明
tp6-api/
├── app/ // 应用目录
│ ├── controller/ // 控制器目录
│ ├── model/ // 模型目录
│ ├── middleware/ // 中间件目录
│ └── ...
├── config/ // 配置目录
├── route/ // 路由目录
├── public/ // web入口目录
└── ...
2.2 数据库配置
修改config/database.php文件,配置数据库连接:
<?php
return [
// 默认数据库连接
'default' => 'mysql',
// 数据库连接信息
'connections' => [
'mysql' => [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'tp6_api',
'username' => 'root',
'password' => 'your_password',
'hostport' => '3306',
'charset' => 'utf8mb4',
'prefix' => 'api_',
'debug' => true,
],
],
];
3. 设计数据库与模型
3.1 创建用户数据表
CREATE TABLE `api_users` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`email` varchar(100) NOT NULL COMMENT '邮箱',
`password` varchar(255) NOT NULL COMMENT '密码',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像',
`status` tinyint(1) DEFAULT '1' COMMENT '状态:1正常,0禁用',
`create_time` int(11) DEFAULT NULL COMMENT '创建时间',
`update_time` int(11) DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
3.2 创建用户模型
创建app/model/User.php:
<?php
namespace appmodel;
use thinkModel;
use thinkmodelconcernSoftDelete;
class User extends Model
{
// 使用软删除
use SoftDelete;
// 设置表名
protected $name = 'users';
// 设置自动时间戳
protected $autoWriteTimestamp = true;
protected $createTime = 'create_time';
protected $updateTime = 'update_time';
protected $deleteTime = 'delete_time';
// 设置字段自动完成
protected $insert = ['status' => 1];
// 设置JSON字段
protected $json = ['meta'];
// 密码加密
public function setPasswordAttr($value)
{
return password_hash($value, PASSWORD_DEFAULT);
}
// 验证密码
public function verifyPassword($password)
{
return password_verify($password, $this->password);
}
}
4. 实现RESTful API控制器
4.1 创建用户控制器
创建app/controller/User.php:
<?php
namespace appcontroller;
use appBaseController;
use appmodelUser as UserModel;
use thinkexceptionValidateException;
use thinkfacadeRequest;
use thinkResponse;
class User extends BaseController
{
/**
* 显示用户列表
*/
public function index()
{
$page = Request::param('page', 1);
$limit = Request::param('limit', 10);
$list = UserModel::where('status', 1)
->paginate([
'page' => $page,
'list_rows' => $limit,
]);
return $this->success('获取成功', $list);
}
/**
* 显示指定用户详情
*/
public function read($id)
{
$user = UserModel::find($id);
if (!$user) {
return $this->error('用户不存在');
}
// 隐藏敏感字段
$user->hidden(['password']);
return $this->success('获取成功', $user);
}
/**
* 创建新用户
*/
public function save()
{
try {
$data = Request::only([
'username', 'email', 'password', 'avatar'
]);
// 验证数据
$this->validate($data, 'appvalidateUser');
// 创建用户
$user = UserModel::create($data);
if ($user) {
// 隐藏密码字段
$user->hidden(['password']);
return $this->success('创建成功', $user);
} else {
return $this->error('创建失败');
}
} catch (ValidateException $e) {
return $this->error($e->getMessage());
}
}
/**
* 更新用户信息
*/
public function update($id)
{
try {
$user = UserModel::find($id);
if (!$user) {
return $this->error('用户不存在');
}
$data = Request::only([
'username', 'email', 'avatar', 'status'
]);
// 如果有密码字段,单独处理
if (Request::has('password')) {
$data['password'] = Request::param('password');
}
// 验证数据
$this->validate($data, 'appvalidateUser.update');
// 更新用户
if ($user->save($data)) {
$user->hidden(['password']);
return $this->success('更新成功', $user);
} else {
return $this->error('更新失败');
}
} catch (ValidateException $e) {
return $this->error($e->getMessage());
}
}
/**
* 删除用户
*/
public function delete($id)
{
$user = UserModel::find($id);
if (!$user) {
return $this->error('用户不存在');
}
if ($user->delete()) {
return $this->success('删除成功');
} else {
return $this->error('删除失败');
}
}
/**
* 统一成功响应
*/
protected function success($message = 'success', $data = [], $code = 200)
{
return Response::create([
'code' => $code,
'message' => $message,
'data' => $data
], 'json');
}
/**
* 统一错误响应
*/
protected function error($message = 'error', $code = 400)
{
return Response::create([
'code' => $code,
'message' => $message,
'data' => null
], 'json');
}
}
5. 数据验证与中间件
5.1 创建用户验证器
创建app/validate/User.php:
<?php
namespace appvalidate;
use thinkValidate;
class User extends Validate
{
protected $rule = [
'username' => 'require|min:3|max:20|unique:users',
'email' => 'require|email|unique:users',
'password' => 'require|min:6|max:20',
'avatar' => 'url',
'status' => 'in:0,1',
];
protected $message = [
'username.require' => '用户名不能为空',
'username.min' => '用户名长度不能少于3个字符',
'username.max' => '用户名长度不能超过20个字符',
'username.unique' => '用户名已存在',
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确',
'email.unique' => '邮箱已存在',
'password.require' => '密码不能为空',
'password.min' => '密码长度不能少于6个字符',
'password.max' => '密码长度不能超过20个字符',
'avatar.url' => '头像链接格式不正确',
'status.in' => '状态值不正确',
];
// 更新场景验证
public function sceneUpdate()
{
return $this->remove('password', 'require')
->remove('username', 'unique')
->remove('email', 'unique');
}
}
5.2 创建API认证中间件
创建app/middleware/Auth.php:
<?php
namespace appmiddleware;
use appserviceJwtService;
use thinkResponse;
class Auth
{
public function handle($request, Closure $next)
{
// 获取token
$token = $request->header('Authorization');
if (!$token) {
return $this->error('Token不能为空', 401);
}
// 验证token
try {
$jwtService = new JwtService();
$payload = $jwtService->verifyToken($token);
// 将用户信息存入请求对象
$request->user = $payload['user'];
return $next($request);
} catch (Exception $e) {
return $this->error('Token验证失败: ' . $e->getMessage(), 401);
}
}
protected function error($message, $code = 401)
{
return Response::create([
'code' => $code,
'message' => $message,
'data' => null
], 'json')->code($code);
}
}
6. JWT认证服务
6.1 创建JWT服务类
创建app/service/JwtService.php:
<?php
namespace appservice;
use FirebaseJWTJWT;
use FirebaseJWTKey;
use thinkfacadeConfig;
class JwtService
{
protected $key;
protected $algorithm = 'HS256';
public function __construct()
{
$this->key = Config::get('app.app_key', 'default_key');
}
/**
* 生成Token
*/
public function createToken($userData, $expire = 7200)
{
$payload = [
'iss' => 'tp6-api', // 签发者
'iat' => time(), // 签发时间
'exp' => time() + $expire, // 过期时间
'user' => $userData // 用户数据
];
return JWT::encode($payload, $this->key, $this->algorithm);
}
/**
* 验证Token
*/
public function verifyToken($token)
{
try {
$decoded = JWT::decode($token, new Key($this->key, $this->algorithm));
return (array)$decoded;
} catch (Exception $e) {
throw new Exception('Token验证失败: ' . $e->getMessage());
}
}
/**
* 刷新Token
*/
public function refreshToken($token)
{
$payload = $this->verifyToken($token);
// 移除过期时间,重新生成
unset($payload['iat']);
unset($payload['exp']);
return $this->createToken($payload['user']);
}
}
6.2 安装JWT依赖包
composer require firebase/php-jwt
7. 路由配置与版本控制
7.1 配置API路由
创建route/app.php:
<?php
use thinkfacadeRoute;
// 用户认证路由
Route::post('login', 'Auth/login');
Route::post('register', 'Auth/register');
Route::post('logout', 'Auth/logout')->middleware('Auth');
// 用户资源路由
Route::group('user', function () {
Route::get('/', 'User/index');
Route::get('/:id', 'User/read');
Route::post('/', 'User/save');
Route::put('/:id', 'User/update');
Route::delete('/:id', 'User/delete');
})->middleware('Auth');
// 支持API版本控制
Route::group('v1', function () {
// v1版本路由
})->prefix('v1.');
Route::group('v2', function () {
// v2版本路由
})->prefix('v2.');
8. 测试API接口
8.1 使用Postman测试用户注册
请求URL:POST http://localhost:8000/register
请求体(JSON):
{
"username": "testuser",
"email": "test@example.com",
"password": "123456"
}
8.2 测试获取用户列表
请求URL:GET http://localhost:8000/user
请求头:
Authorization: Bearer your_jwt_token_here
Content-Type: application/json
9. 性能优化与部署建议
9.1 开启路由缓存
# 生成路由缓存
php think optimize:route
9.2 配置缓存驱动
修改config/cache.php:
return [
// 默认缓存驱动
'default' => env('cache.driver', 'redis'),
// 缓存连接配置
'stores' => [
'redis' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'prefix' => 'tp6:',
],
],
];
9.3 使用OPcache加速
在php.ini中启用OPcache:
[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0
opcache.enable_cli=1
10. 总结
通过本教程,我们学习了如何使用ThinkPHP 6.0构建一个完整的RESTful API,包括:
- 项目创建与配置
- 数据库设计与模型创建
- RESTful控制器实现
- 数据验证与中间件
- JWT认证实现
- 路由配置与版本控制
- 性能优化与部署
ThinkPHP 6.0提供了强大的工具和灵活的架构,使得API开发变得简单高效。希望本教程能帮助你在实际项目中更好地使用ThinkPHP进行API开发。