ThinkPHP 6.x API接口开发实战:构建RESTful风格用户管理系统

2025-08-27 0 234

在现代Web开发中,API接口开发已成为不可或缺的技能。本文将深入讲解如何使用ThinkPHP 6.x框架开发一套完整的RESTful风格的API接口,实现用户管理系统的核心功能。

一、RESTful API设计原则

在开始编码之前,我们需要了解RESTful API的基本设计原则:

  • 使用HTTP方法表达操作类型(GET、POST、PUT、DELETE)
  • URL代表资源,使用名词而非动词
  • 返回统一格式的数据(通常为JSON)
  • 无状态通信

二、项目初始化与配置

2.1 创建项目与数据库配置

使用Composer创建ThinkPHP项目:

composer create-project topthink/think api-project
cd api-project
    

配置数据库连接(config/database.php):

return [
    'default' => 'mysql',
    'connections' => [
        'mysql' => [
            'type' => 'mysql',
            'hostname' => '127.0.0.1',
            'database' => 'api_demo',
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8mb4',
            'prefix' => 'api_',
        ],
    ],
];
    

2.2 创建数据库表

创建用户表:

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 '状态:0禁用,1启用',
  `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;
    

三、核心功能实现

3.1 创建用户模型

创建app/model/User.php:

namespace appmodel;

use thinkModel;
use thinkmodelconcernSoftDelete;

class User extends Model
{
    // 使用软删除
    use SoftDelete;
    
    protected $name = 'users';
    protected $autoWriteTimestamp = true;
    protected $deleteTime = 'delete_time';
    protected $hidden = ['password', 'delete_time'];
    
    // 自动加密密码
    public function setPasswordAttr($value)
    {
        return password_hash($value, PASSWORD_DEFAULT);
    }
    
    // 状态获取器
    public function getStatusAttr($value)
    {
        $status = [0 => '禁用', 1 => '启用'];
        return $status[$value];
    }
    
    // 创建时间获取器
    public function getCreateTimeAttr($value)
    {
        return date('Y-m-d H:i:s', $value);
    }
}
    

3.2 实现JWT身份验证

安装JWT扩展:

composer require firebase/php-jwt
    

创建app/common/JwtAuth.php:

namespace appcommon;

use thinkfacadeRequest;
use FirebaseJWTJWT;
use FirebaseJWTKey;
use thinkfacadeConfig;

class JwtAuth
{
    private static $key = 'your-secret-key'; // 加密密钥
    
    // 生成token
    public static function createToken($userId, $username)
    {
        $payload = [
            'iss' => 'your-domain.com', // 签发者
            'aud' => 'your-domain.com', // 接收方
            'iat' => time(), // 签发时间
            'nbf' => time(), // 生效时间
            'exp' => time() + 7200, // 过期时间(2小时)
            'data' => [
                'user_id' => $userId,
                'username' => $username
            ]
        ];
        
        return JWT::encode($payload, self::$key, 'HS256');
    }
    
    // 验证token
    public static function verifyToken($token)
    {
        try {
            $decoded = JWT::decode($token, new Key(self::$key, 'HS256'));
            return (array) $decoded->data;
        } catch (Exception $e) {
            return false;
        }
    }
    
    // 获取当前用户ID
    public static function getCurrentUserId()
    {
        $token = Request::header('Authorization');
        if (!$token) {
            return false;
        }
        
        // 去除Bearer前缀
        if (strpos($token, 'Bearer ') === 0) {
            $token = substr($token, 7);
        }
        
        $userData = self::verifyToken($token);
        return $userData ? $userData['user_id'] : false;
    }
}
    

3.3 创建中间件进行权限验证

创建app/middleware/JwtAuth.php:

namespace appmiddleware;

use appcommonJwtAuth;
use thinkfacadeRequest;
use thinkResponse;

class JwtAuthMiddleware
{
    public function handle($request, Closure $next)
    {
        // 排除登录和注册接口
        $excludeRoutes = ['user/login', 'user/register'];
        $path = $request->pathinfo();
        
        if (in_array($path, $excludeRoutes)) {
            return $next($request);
        }
        
        $token = Request::header('Authorization');
        if (!$token) {
            return json(['code' => 401, 'msg' => 'Token不能为空'], 401);
        }
        
        // 去除Bearer前缀
        if (strpos($token, 'Bearer ') === 0) {
            $token = substr($token, 7);
        }
        
        $userData = JwtAuth::verifyToken($token);
        if (!$userData) {
            return json(['code' => 401, 'msg' => 'Token无效或已过期'], 401);
        }
        
        // 将用户信息添加到请求对象中
        $request->user = $userData;
        
        return $next($request);
    }
}
    

注册中间件(app/middleware.php):

return [
    // 全局中间件
    appmiddlewareJwtAuthMiddleware::class,
];
    

3.4 创建用户控制器

创建app/controller/User.php:

namespace appcontroller;

use appBaseController;
use appmodelUser as UserModel;
use appcommonJwtAuth;
use thinkfacadeRequest;
use thinkfacadeValidate;

class User extends BaseController
{
    // 用户注册
    public function register()
    {
        $data = Request::only(['username', 'email', 'password']);
        
        // 数据验证
        $validate = Validate::rule([
            'username|用户名' => 'require|alphaNum|length:3,20|unique:users',
            'email|邮箱' => 'require|email|unique:users',
            'password|密码' => 'require|length:6,20',
        ]);
        
        if (!$validate->check($data)) {
            return json(['code' => 400, 'msg' => $validate->getError()], 400);
        }
        
        // 创建用户
        $user = UserModel::create($data);
        
        if ($user) {
            return json([
                'code' => 200,
                'msg' => '注册成功',
                'data' => [
                    'user_id' => $user->id,
                    'username' => $user->username,
                    'email' => $user->email
                ]
            ]);
        } else {
            return json(['code' => 500, 'msg' => '注册失败'], 500);
        }
    }
    
    // 用户登录
    public function login()
    {
        $data = Request::only(['username', 'password']);
        
        // 数据验证
        $validate = Validate::rule([
            'username|用户名' => 'require',
            'password|密码' => 'require',
        ]);
        
        if (!$validate->check($data)) {
            return json(['code' => 400, 'msg' => $validate->getError()], 400);
        }
        
        // 查找用户
        $user = UserModel::where('username', $data['username'])
                ->whereOr('email', $data['username'])
                ->find();
        
        if (!$user || !password_verify($data['password'], $user->password)) {
            return json(['code' => 401, 'msg' => '用户名或密码错误'], 401);
        }
        
        if ($user->status == 0) {
            return json(['code' => 401, 'msg' => '账号已被禁用'], 401);
        }
        
        // 生成token
        $token = JwtAuth::createToken($user->id, $user->username);
        
        return json([
            'code' => 200,
            'msg' => '登录成功',
            'data' => [
                'token' => $token,
                'user_info' => [
                    'user_id' => $user->id,
                    'username' => $user->username,
                    'email' => $user->email,
                    'avatar' => $user->avatar
                ]
            ]
        ]);
    }
    
    // 获取用户信息
    public function info()
    {
        $userId = JwtAuth::getCurrentUserId();
        $user = UserModel::find($userId);
        
        if (!$user) {
            return json(['code' => 404, 'msg' => '用户不存在'], 404);
        }
        
        return json([
            'code' => 200,
            'msg' => '获取成功',
            'data' => $user
        ]);
    }
    
    // 更新用户信息
    public function update()
    {
        $userId = JwtAuth::getCurrentUserId();
        $data = Request::only(['email', 'avatar']);
        
        // 数据验证
        $validate = Validate::rule([
            'email|邮箱' => 'email|unique:users,email,' . $userId,
            'avatar|头像' => 'url',
        ]);
        
        if (!$validate->check($data)) {
            return json(['code' => 400, 'msg' => $validate->getError()], 400);
        }
        
        // 更新用户信息
        $user = UserModel::find($userId);
        $result = $user->save($data);
        
        if ($result) {
            return json([
                'code' => 200,
                'msg' => '更新成功',
                'data' => $user
            ]);
        } else {
            return json(['code' => 500, 'msg' => '更新失败'], 500);
        }
    }
    
    // 删除用户(软删除)
    public function delete()
    {
        $userId = JwtAuth::getCurrentUserId();
        $user = UserModel::find($userId);
        
        if (!$user) {
            return json(['code' => 404, 'msg' => '用户不存在'], 404);
        }
        
        $result = $user->delete();
        
        if ($result) {
            return json(['code' => 200, 'msg' => '删除成功']);
        } else {
            return json(['code' => 500, 'msg' => '删除失败'], 500);
        }
    }
}
    

3.5 配置API路由

创建route/api.php:

use thinkfacadeRoute;

// 用户路由组
Route::group('user', function() {
    Route::post('register', 'user/register'); // 用户注册
    Route::post('login', 'user/login');       // 用户登录
    Route::get('info', 'user/info');          // 获取用户信息
    Route::put('update', 'user/update');      // 更新用户信息
    Route::delete('delete', 'user/delete');   // 删除用户
});
    

四、统一响应处理

4.1 创建基础控制器

修改app/BaseController.php,添加统一响应方法:

namespace app;

use thinkApp;
use thinkexceptionValidateException;
use thinkValidate;

abstract class BaseController
{
    protected $app;
    protected $request;
    
    public function __construct(App $app)
    {
        $this->app = $app;
        $this->request = $this->app->request;
    }
    
    // 成功响应
    protected function success($data = null, $msg = '操作成功', $code = 200)
    {
        $result = [
            'code' => $code,
            'msg' => $msg,
            'data' => $data
        ];
        
        return json($result);
    }
    
    // 错误响应
    protected function error($msg = '操作失败', $code = 500, $data = null)
    {
        $result = [
            'code' => $code,
            'msg' => $msg,
            'data' => $data
        ];
        
        return json($result, $code);
    }
    
    // 验证数据
    protected function validateData($data, $validate, $message = [])
    {
        try {
            validate($validate, $message)->check($data);
        } catch (ValidateException $e) {
            return $this->error($e->getMessage(), 400);
        }
        
        return true;
    }
}
    

4.2 全局异常处理

修改app/ExceptionHandle.php,处理API异常:

public function render($request, Throwable $e): Response
{
    // 如果是API请求
    if ($request->isAjax() || strpos($request->pathinfo(), 'api/') === 0) {
        // 记录异常日志
        Log::error($e->getMessage());
        
        // 返回JSON格式的错误信息
        $code = $e->getCode() ?: 500;
        $msg = $e->getMessage();
        
        // 生产环境隐藏详细错误
        if (!env('app_debug') && $code == 500) {
            $msg = '内部服务器错误';
        }
        
        return json([
            'code' => $code,
            'msg' => $msg,
            'data' => null
        ], $code);
    }
    
    // 其他请求使用默认异常处理
    return parent::render($request, $e);
}
    

五、API文档生成与测试

5.1 使用Swagger生成API文档

安装swagger-php:

composer require zircote/swagger-php
    

在控制器中添加注解:

/**
 * @OAInfo(title="用户管理API", version="1.0.0")
 */
class User extends BaseController
{
    /**
     * 用户注册
     * @OAPost(
     *     path="/user/register",
     *     summary="用户注册",
     *     tags={"用户"},
     *     @OARequestBody(
     *         required=true,
     *         @OAJsonContent(
     *             required={"username", "email", "password"},
     *             @OAProperty(property="username", type="string", example="testuser"),
     *             @OAProperty(property="email", type="string", format="email", example="test@example.com"),
     *             @OAProperty(property="password", type="string", format="password", example="123456")
     *         )
     *     ),
     *     @OAResponse(
     *         response=200,
     *         description="注册成功",
     *         @OAJsonContent(ref="#/components/schemas/ApiResponse")
     *     )
     * )
     */
    public function register()
    {
        // 方法实现
    }
}
    

5.2 使用Postman测试API

创建Postman集合,包含以下请求:

  • POST /user/register – 用户注册
  • POST /user/login – 用户登录
  • GET /user/info – 获取用户信息(需要Authorization头)
  • PUT /user/update – 更新用户信息(需要Authorization头)
  • DELETE /user/delete – 删除用户(需要Authorization头)

六、部署与性能优化

6.1 生产环境配置

修改.env文件:

APP_DEBUG = false
APP_TRACE = false

// 数据库配置
DATABASE_HOSTNAME = 127.0.0.1
DATABASE_DATABASE = api_demo
DATABASE_USERNAME = root
DATABASE_PASSWORD = your_password
    

6.2 使用Redis缓存

安装predis扩展:

composer require predis/predis
    

配置Redis(config/cache.php):

return [
    'default' => 'redis',
    'stores' => [
        'redis' => [
            'type' => 'redis',
            'host' => '127.0.0.1',
            'port' => 6379,
            'password' => '',
            'select' => 0,
            'timeout' => 0,
            'persistent' => false,
        ],
    ],
];
    

在控制器中使用缓存:

use thinkfacadeCache;

// 获取用户信息时使用缓存
public function info()
{
    $userId = JwtAuth::getCurrentUserId();
    $cacheKey = 'user_info_' . $userId;
    
    $user = Cache::remember($cacheKey, function() use ($userId) {
        return UserModel::find($userId);
    }, 3600); // 缓存1小时
    
    if (!$user) {
        return $this->error('用户不存在', 404);
    }
    
    return $this->success($user, '获取成功');
}
    

七、总结

本文详细介绍了如何使用ThinkPHP 6.x开发一套完整的RESTful API接口,涵盖了用户管理系统的核心功能。通过本教程,你学会了:

  1. ThinkPHP项目初始化与配置
  2. RESTful API设计原则与实现
  3. JWT身份验证的实现
  4. 中间件的使用与自定义
  5. 统一响应格式与异常处理
  6. API文档生成与测试
  7. 性能优化与生产环境部署

这套API系统遵循了RESTful设计原则,具有良好的可扩展性和维护性。你可以在此基础上继续扩展更多功能,如权限管理、文件上传、消息队列等,构建更复杂的应用系统。

ThinkPHP 6.x提供了强大的功能和灵活的扩展机制,非常适合API接口开发。希望本教程能帮助你在ThinkPHP API开发领域取得进步!

ThinkPHP 6.x API接口开发实战:构建RESTful风格用户管理系统
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

淘吗网 thinkphp ThinkPHP 6.x API接口开发实战:构建RESTful风格用户管理系统 https://www.taomawang.com/server/thinkphp/989.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务