2025 PHP REST API 快速入门指南:从零构建到实战

作者:API传播员 · 2025-10-13 · 阅读时间:5分钟

作为 PHP 开发的新手,构建一个功能完善的 REST API 可能看起来有些复杂。但通过一份清晰、现代化的指南,您可以轻松掌握 REST API 的核心技巧。在本文中,我们将带您使用 PHP 8+MySQL 分步构建一个简单的 REST API,实现员工数据管理功能。

REST API 是现代 Web 开发的核心组件,广泛用于前后端分离架构,通过标准 HTTP 方法实现数据访问和操作。本文以获取员工列表的示例应用为案例,深入讲解 API 的构建流程和最佳实践。


一、项目文件结构

在本地创建一个目录,例如 REST-API,用于存放以下主要文件:

文件名 功能说明
config.php 数据库配置与连接
employee.php Employee 类:实现增删改查(CRUD)操作
api.php API 入口,处理 HTTP 请求并返回 JSON 响应
curl_helper.php 通用 cURL 请求函数,用于客户端调用 API
index.php 示例文件,演示如何调用 API 端点

二、数据库设计

首先创建数据库:

CREATE DATABASE employee_management;

然后创建员工表:

CREATE TABLE employee (
    id INT PRIMARY KEY AUTO_INCREMENT,
    emp_name VARCHAR(100) NOT NULL,
    emp_code VARCHAR(20) NOT NULL,
    emp_email VARCHAR(100) NOT NULL,
    emp_phone VARCHAR(20) NOT NULL,
    emp_address VARCHAR(255) NOT NULL,
    emp_designation VARCHAR(100) NOT NULL,
    emp_joining_date DATE NOT NULL
);

这是基本的员工表结构,可根据实际项目需求进行扩展。


三、核心文件说明

1. config.php

配置数据库连接,示例:

<?php
$host = 'localhost';
$db = 'employee_management';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    die("Database connection failed: " . $e->getMessage());
}

采用 PDO 提高安全性,避免 SQL 注入风险。


2. employee.php

封装员工 CRUD 操作的 Employee 类:

<?php
class Employee {
    private $conn;

    public function __construct($pdo) {
        $this->conn = $pdo;
    }

    public function getAllEmployees() {
        $stmt = $this->conn->query("SELECT * FROM employee");
        return $stmt->fetchAll();
    }

    public function getEmployeeById($id) {
        $stmt = $this->conn->prepare("SELECT * FROM employee WHERE id = ?");
        $stmt->execute([$id]);
        return $stmt->fetch();
    }

    public function addEmployee($data) {
        $stmt = $this->conn->prepare("INSERT INTO employee (emp_name, emp_code, emp_email, emp_phone, emp_address, emp_designation, emp_joining_date) VALUES (?, ?, ?, ?, ?, ?, ?)");
        return $stmt->execute([
            $data['emp_name'], $data['emp_code'], $data['emp_email'], $data['emp_phone'],
            $data['emp_address'], $data['emp_designation'], $data['emp_joining_date']
        ]);
    }

    public function updateEmployee($id, $data) {
        $stmt = $this->conn->prepare("UPDATE employee SET emp_name=?, emp_code=?, emp_email=?, emp_phone=?, emp_address=?, emp_designation=?, emp_joining_date=? WHERE id=?");
        return $stmt->execute([
            $data['emp_name'], $data['emp_code'], $data['emp_email'], $data['emp_phone'],
            $data['emp_address'], $data['emp_designation'], $data['emp_joining_date'], $id
        ]);
    }

    public function deleteEmployee($id) {
        $stmt = $this->conn->prepare("DELETE FROM employee WHERE id=?");
        return $stmt->execute([$id]);
    }
}

3. api.php

处理 HTTP 请求并返回 JSON 响应:

<?php
header('Content-Type: application/json');
require 'config.php';
require 'employee.php';

$employee = new Employee($pdo);
$method = $_SERVER['REQUEST_METHOD'];
$path = explode('/', trim($_SERVER['PATH_INFO'] ?? '', '/'));

switch ($method) {
    case 'GET':
        if (isset($path[1])) {
            echo json_encode($employee->getEmployeeById($path[1]));
        } else {
            echo json_encode($employee->getAllEmployees());
        }
        break;
    case 'POST':
        $data = json_decode(file_get_contents('php://input'), true);
        echo json_encode(['success' => $employee->addEmployee($data)]);
        break;
    case 'PUT':
        $data = json_decode(file_get_contents('php://input'), true);
        echo json_encode(['success' => $employee->updateEmployee($path[1], $data)]);
        break;
    case 'DELETE':
        echo json_encode(['success' => $employee->deleteEmployee($path[1])]);
        break;
    default:
        http_response_code(405);
        echo json_encode(['error' => 'Method Not Allowed']);
}

4. curl_helper.php

提供统一的 API 请求方法:

<?php
function sendRequest($url, $method = 'GET', $data = []) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if (in_array($method, ['POST', 'PUT'])) {
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    } elseif ($method === 'DELETE') {
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
    }

    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return json_encode(['response' => $response, 'http_code' => $httpCode]);
}

5. index.php 示例

调用 API 端点示例:

require 'curl_helper.php';

// 获取所有员工
$employees = json_decode(sendRequest('http://localhost/REST-API/api.php/employees'), true);

// 添加新员工
$data = [
    'emp_name' => 'Alice Smith',
    'emp_code' => 'E100',
    'emp_email' => 'alice@example.com',
    'emp_phone' => '1234567890',
    'emp_address' => '123 Main St',
    'emp_designation' => 'Developer',
    'emp_joining_date' => '2025-01-01',
];
$result = json_decode(sendRequest('http://localhost/REST-API/api.php/employees', 'POST', $data), true);

使用 index.php 可以快速测试 API 功能。


四、最佳实践与优化(2025 风格)

  1. 使用 PHP 8+ 功能:类型声明、命名参数、箭头函数。
  2. 安全性:使用 PDO 和参数化查询防止 SQL 注入。
  3. 响应标准化:统一 JSON 输出格式,包含状态码和错误信息。
  4. 版本控制:建议在 URL 中加入 API 版本,如 /api/v1/employees
  5. 可扩展性:通过单独类封装 CRUD,方便未来添加复杂业务逻辑。
  6. 日志和监控:记录 API 请求日志,便于调试和性能分析。

五、总结

通过本教程,您已经掌握了 使用 PHP 和 MySQL 构建 REST API 的完整流程,从数据库设计到 API 封装、HTTP 请求处理及客户端调用。借助现代 PHP 特性和安全实践,您可以轻松构建可维护、可扩展的 API,为后续开发提供坚实基础。


原文链接: https://wpwebinfotech.com/blog/how-to-build-simple-rest-api-in-php/