基于PHP8和MySQL设计安全稳定可扩展的多应用API架构

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

基于PHP8和MySQL,不使用第三方框架,设计一个安全稳定可扩展的多应用API架构,给出目录结构和代码

回答:

设计一个安全、稳定且可扩展的多应用API架构是一个复杂的任务,尤其是在不使用第三方框架的情况下。以下是一个基本的目录结构和一些示例代码,帮助你开始这个项目。

目录结构

/api
    /v1
        /controllers
            UserController.php
        /models
            User.php
        /services
            UserService.php
        /routes
            routes.php
    /v2
        /controllers
            UserController.php
        /models
            User.php
        /services
            UserService.php
        /routes
            routes.php
/config
    config.php
/core
    Database.php
    Router.php
    Request.php
    Response.php
/public
    index.php
/vendor
    autoload.php

示例代码

/config/config.php

<?php
return [
    'db' => [
        'host' => 'localhost',
        'dbname' => 'your_database',
        'user' => 'your_user',
        'password' => 'your_password',
    ],
];

/core/Database.php

<?php

class Database {
    private $pdo;

    public function __construct($config) {
        $this->pdo = new PDO(
            "mysql:host={$config['host']};dbname={$config['dbname']}",
            $config['user'],
            $config['password']
        );
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    public function getConnection() {
        return $this->pdo;
    }
}

/core/Router.php

<?php

class Router {
    private $routes = [];

    public function add($method, $path, $handler) {
        $this->routes[] = compact('method', 'path', 'handler');
    }

    public function dispatch($method, $path) {
        foreach ($this->routes as $route) {
            if ($route['method'] === $method && $route['path'] === $path) {
                return call_user_func($route['handler']);
            }
        }
        http_response_code(404);
        echo json_encode(['error' => 'Not Found']);
    }
}

/core/Request.php

<?php

class Request {
    public function getBody() {
        return json_decode(file_get_contents('php://input'), true);
    }
}

/core/Response.php

<?php

class Response {
    public function json($data, $status = 200) {
        http_response_code($status);
        header('Content-Type: application/json');
        echo json_encode($data);
    }
}

/api/v1/controllers/UserController.php

<?php

require_once __DIR__ . '/../../../../core/Request.php';
require_once __DIR__ . '/../../../../core/Response.php';
require_once __DIR__ . '/../services/UserService.php';

class UserController {
    private $userService;

    public function __construct() {
        $this->userService = new UserService();
    }

    public function getUsers() {
        $response = new Response();
        $users = $this->userService->getAllUsers();
        $response->json($users);
    }

    public function createUser() {
        $request = new Request();
        $response = new Response();
        $data = $request->getBody();
        $this->userService->createUser($data);
        $response->json(['message' => 'User created'], 201);
    }
}

/api/v1/models/User.php

<?php

require_once __DIR__ . '/../../../../core/Database.php';

class User {
    private $db;

    public function __construct() {
        $config = require __DIR__ . '/../../../../config/config.php';
        $this->db = (new Database($config['db']))->getConnection();
    }

    public function getAll() {
        $stmt = $this->db->query('SELECT * FROM users');
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    public function create($data) {
        $stmt = $this->db->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
        $stmt->execute([
            'name' => $data['name'],
            'email' => $data['email'],
        ]);
    }
}

/api/v1/services/UserService.php

<?php

require_once __DIR__ . '/../models/User.php';

class UserService {
    private $userModel;

    public function __construct() {
        $this->userModel = new User();
    }

    public function getAllUsers() {
        return $this->userModel->getAll();
    }

    public function createUser($data) {
        $this->userModel->create($data);
    }
}

/api/v1/routes/routes.php

<?php

require_once __DIR__ . '/../controllers/UserController.php';

$router = new Router();

$router->add('GET', '/api/v1/users', [new UserController(), 'getUsers']);
$router->add('POST', '/api/v1/users', [new UserController(), 'createUser']);

/public/index.php

<?php

require_once __DIR__ . '/../core/Router.php';

$router = new Router();

require_once __DIR__ . '/../api/v1/routes/routes.php';

$method = $_SERVER['REQUEST_METHOD'];
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

$router->dispatch($method, $path);

说明

  1. 配置文件/config/config.php 包含数据库连接信息。
  2. 核心类/core 目录下包含数据库连接、路由、请求和响应处理的核心类。
  3. API 版本/api/v1 目录下包含控制器、模型和服务类。可以通过类似的方式创建 /api/v2 目录来支持多个版本的 API。
  4. 路由/api/v1/routes/routes.php 定义了 API 路由。
  5. 入口文件/public/index.php 是应用的入口文件,处理所有的请求。

这个架构是一个基础的起点,可以根据需要进行扩展和优化。为了提高安全性和稳定性,还需要添加更多的功能,如输入验证、错误处理、日志记录和身份验证等。