本文目录导读:

我来系统地介绍PHP接口管理的各种方案和最佳实践。
基础接口管理方式
简单路由管理
// index.php
$route = $_GET['route'] ?? 'home';
switch ($route) {
case 'user/list':
$controller = new UserController();
echo $controller->list();
break;
case 'user/detail':
$controller = new UserController();
echo $controller->detail($_GET['id']);
break;
default:
http_response_code(404);
echo json_encode(['error' => 'Not Found']);
}
使用Composer自动加载
// composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
主流框架选择
Laravel(推荐)
// routes/api.php
Route::prefix('v1')->group(function () {
Route::get('users', 'UserController@index');
Route::post('users', 'UserController@store');
Route::put('users/{id}', 'UserController@update');
// 中间件保护
Route::middleware('auth:api')->group(function () {
Route::get('profile', 'ProfileController@show');
});
});
ThinkPHP 6
// route/app.php
Route::group('api', function () {
Route::get('users', 'User/index');
Route::post('users', 'User/save');
});
// 控制器
namespace app\api\controller;
class User extends Base
{
public function index()
{
return json(['code' => 0, 'data' => UserModel::all()]);
}
}
RESTful API设计规范
接口设计示例
class UserController extends Controller
{
// GET /api/users - 获取用户列表
public function index(Request $request)
{
$query = User::query();
// 筛选
if ($request->has('status')) {
$query->where('status', $request->status);
}
// 排序
$query->orderBy($request->sort ?? 'id', $request->order ?? 'desc');
// 分页
$users = $query->paginate($request->limit ?? 15);
return response()->json([
'code' => 0,
'data' => $users->items(),
'meta' => [
'total' => $users->total(),
'page' => $users->currentPage(),
'limit' => $users->perPage()
]
]);
}
// POST /api/users - 创建用户
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:50',
'email' => 'required|email|unique:users'
]);
if ($validator->fails()) {
return response()->json([
'code' => 422,
'message' => '验证失败',
'errors' => $validator->errors()
], 422);
}
$user = User::create($request->all());
return response()->json([
'code' => 0,
'message' => '创建成功',
'data' => $user
], 201);
}
}
接口文档管理
使用Swagger/OpenAPI
/**
* @OA\Get(
* path="/api/users",
* summary="获取用户列表",
* tags={"用户"},
* @OA\Parameter(
* name="page",
* in="query",
* required=false,
* @OA\Schema(type="integer")
* ),
* @OA\Response(
* response=200,
* description="成功",
* @OA\JsonContent(
* @OA\Property(property="code", type="integer"),
* @OA\Property(property="data", type="array",
* @OA\Items(ref="#/components/schemas/User")
* )
* )
* )
* )
*/
public function index(Request $request)
{
// 接口实现
}
ApiDoc注释文档
/**
* @api {get} /api/user 获取用户信息
* @apiGroup User
* @apiVersion 1.0.0
* @apiParam {Number} id 用户ID
*
* @apiSuccess {Number} code 状态码
* @apiSuccess {Object} data 用户数据
* @apiSuccessExample {json} 成功示例:
* {
* "code": 0,
* "data": {
* "id": 1,
* "name": "张三",
* "email": "zhangsan@example.com"
* }
* }
*/
API版本管理
版本控制策略
// 方案1:URL版本
Route::prefix('v1')->group(function () {
Route::get('users', 'Api\V1\UserController@index');
});
Route::prefix('v2')->group(function () {
Route::get('users', 'Api\V2\UserController@index');
});
// 方案2:Header版本
Route::middleware('api.version')->group(function () {
Route::get('users', 'UserController@index');
});
中间件版本管理
class ApiVersionMiddleware
{
public function handle($request, $next)
{
$version = $request->header('X-API-Version', 'v1');
if ($version === 'v2') {
// 加载v2版本的控制器
app()->instance(UserController::class, new \App\Api\V2\UserController());
}
return $next($request);
}
}
安全认证
JWT认证
use Firebase\JWT\JWT;
class AuthController extends Controller
{
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (!Auth::attempt($credentials)) {
return response()->json(['error' => '登录失败'], 401);
}
$user = Auth::user();
// 生成JWT
$payload = [
'user_id' => $user->id,
'exp' => time() + 7200
];
$token = JWT::encode($payload, env('JWT_SECRET'), 'HS256');
return response()->json(['token' => $token]);
}
// 验证中间件
public function authenticate($request, $next)
{
try {
$token = $request->bearerToken();
$credentials = JWT::decode($token, env('JWT_SECRET'), ['HS256']);
$request->user_id = $credentials->user_id;
return $next($request);
} catch (\Exception $e) {
return response()->json(['error' => '未授权'], 401);
}
}
}
统一响应格式
trait ApiResponseTrait
{
protected function success($data = null, $message = 'success', $code = 0)
{
return response()->json([
'code' => $code,
'message' => $message,
'data' => $data
], 200);
}
protected function error($message = 'error', $code = 400, $status = 400)
{
return response()->json([
'code' => $code,
'message' => $message,
'data' => null
], $status);
}
protected function notFound($message = '资源不存在')
{
return $this->error($message, 404, 404);
}
}
class UserController extends Controller
{
use ApiResponseTrait;
public function show($id)
{
$user = User::find($id);
if (!$user) {
return $this->notFound('用户不存在');
}
return $this->success($user);
}
}
监控和日志
class ApiLogger
{
public static function log($request, $response, $startTime)
{
$executionTime = microtime(true) - $startTime;
$logData = [
'url' => $request->fullUrl(),
'method' => $request->method(),
'params' => $request->all(),
'ip' => $request->ip(),
'response' => $response,
'execution_time' => round($executionTime * 1000, 2) . 'ms'
];
Log::channel('api')->info('API Request', $logData);
}
}
// 中间件调用
class ApiLoggerMiddleware
{
public function handle($request, $next)
{
$startTime = microtime(true);
$response = $next($request);
ApiLogger::log($request, $response->getContent(), $startTime);
return $response;
}
}
性能优化
// 缓存管理
class CacheService
{
public static function remember($key, $ttl, $callback)
{
$cached = Cache::get($key);
if ($cached !== null) {
return $cached;
}
$data = $callback();
Cache::put($key, $data, $ttl);
return $data;
}
}
// 使用
public function index()
{
$users = CacheService::remember('users:all', 600, function () {
return User::with('profile')->get();
});
return $this->success($users);
}
完整的接口管理示例
// ApiBase.php 基类
class ApiBaseController extends Controller
{
use ApiResponseTrait;
protected $service;
public function __construct()
{
// 跨域处理
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
// 请求日志
Log::channel('api')->info('API Access', [
'url' => request()->fullUrl(),
'method' => request()->method(),
'agent' => request()->userAgent()
]);
}
protected function validateRequest($rules)
{
$validator = Validator::make(request()->all(), $rules);
if ($validator->fails()) {
return $this->error('参数验证失败', 422);
}
return null;
}
}
// 具体控制器
class ProductController extends ApiBaseController
{
public function index()
{
$products = Product::paginate(20);
return $this->success($products);
}
public function show($id)
{
$product = Product::find($id);
if (!$product) {
return $this->notFound('产品不存在');
}
return $this->success($product);
}
public function store(Request $request)
{
$rules = [
'name' => 'required|string|max:100',
'price' => 'required|numeric|min:0'
];
$validationError = $this->validateRequest($rules);
if ($validationError) {
return $validationError;
}
$product = Product::create($request->all());
return $this->success($product, '创建成功');
}
}
推荐工具
- Postman/Insomnia - 接口测试
- Swagger - 接口文档
- Laravel Telescope - 接口监控
- Redis - 缓存和限流
- Sentry - 错误监控
- 使用版本控制(URL或Header)
- 统一响应格式
- 完善的错误处理
- 权限验证和速率限制
- 完整的接口文档
- 详细请求日志
- 性能监控和优化
这些方法能帮你构建规范、安全、易维护的PHP API接口系统,根据项目需求选择合适的方案即可。