基于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
<?php
return [
'db' => [
'host' => 'localhost',
'dbname' => 'your_database',
'user' => 'your_user',
'password' => 'your_password',
],
];
<?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;
}
}
<?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']);
}
}
<?php
class Request {
public function getBody() {
return json_decode(file_get_contents('php://input'), true);
}
}
<?php
class Response {
public function json($data, $status = 200) {
http_response_code($status);
header('Content-Type: application/json');
echo json_encode($data);
}
}
<?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);
}
}
<?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'],
]);
}
}
<?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);
}
}
<?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']);
<?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);
/config/config.php
包含数据库连接信息。/core
目录下包含数据库连接、路由、请求和响应处理的核心类。/api/v1
目录下包含控制器、模型和服务类。可以通过类似的方式创建 /api/v2
目录来支持多个版本的 API。/api/v1/routes/routes.php
定义了 API 路由。/public/index.php
是应用的入口文件,处理所有的请求。这个架构是一个基础的起点,可以根据需要进行扩展和优化。为了提高安全性和稳定性,还需要添加更多的功能,如输入验证、错误处理、日志记录和身份验证等。