Создание эффективного нативного PHP маршрутизатора
Маршрутизация - важнейший аспект любого веб-приложения. Несмотря на то, что такие платформы, как Laravel, предлагают сложные системы маршрутизации, иногда требуется гибкость и управляемость нативного PHP-решения. В этой статье показано, как создать надежный и эффективный маршрутизатор на нативном PHP, предназначенный для специалистов.
Структура проекта
php-native-router/
├── controllers/
│ ├── HomeController.php
│ ├── UserController.php
├── Router.php
├── index.php
Каждый компонент служит определенной цели:
- index.php: Точка входа приложения, которое инициализирует и отправляет маршруты.
- Router.php: Основная логика маршрутизации для обработки запросов.
- Контроллеры: Специальная логика для различных областей применения (например, HomeController, UserController).
Реализация маршрутизатора
Класс Router является основой приложения, обеспечивая динамическое сопоставление маршрутов и их выполнение. Вот реализация:
<?php
class Router {
private array $routes = [];
public function add(string $method, string $path, callable|array $handler): void {
$this->routes[] = compact('method', 'path', 'handler');
}
public function dispatch(string $requestUri, string $requestMethod): void {
foreach ($this->routes as $route) {
$params = [];
if ($route['method'] === strtoupper($requestMethod) && $this->match($route['path'], $requestUri, $params)) {
call_user_func_array($route['handler'], $params);
return;
}
}
// Обработка 404
http_response_code(404);
echo "404 Нет такой страницы";
}
private function match(string $routePath, string $requestUri, array &$params): bool {
$routePattern = preg_replace('/\{([\w]+)\}/', '(?P<$1>[^/]+)', $routePath);
$routePattern = '#^' . $routePattern . '$#';
if (preg_match($routePattern, $requestUri, $matches)) {
$params = array_filter($matches, 'is_string', ARRAY_FILTER_USE_KEY);
return true;
}
return false;
}
}
Определение маршрутов
Маршруты определены в файле index.php, где мы сопоставляем обработчикам конкретные методы запроса и URL-адреса.
<?php
require_once 'Router.php';
require_once 'controllers/HomeController.php';
require_once 'controllers/UserController.php';
// Инициализация роутера
$router = new Router();
// Определение маршрутов
$router->add('GET', '/', [HomeController::class, 'index']);
$router->add('GET', '/user/{id}', [UserController::class, 'show']);
$router->add('POST', '/user', [UserController::class, 'create']);
// Отправка запроса
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$requestMethod = $_SERVER['REQUEST_METHOD'];
$router->dispatch($requestUri, $requestMethod);
Создаем контроллеры
Контроллеры инкапсулируют логику приложения. Вот как реализованы HomeController и UserController:
HomeController.php
<?php
class HomeController {
public static function index(): void {
echo "Добро пожаловать на главную!";
}
}
UserController.php
<?php
class UserController {
public static function show(string $id): void {
echo "ID пользователя: " . htmlspecialchars($id);
}
public static function create(): void {
echo "Пользователь создан!";
}
}
Тестируем наш роутер
Запускаем на локалке сервер
php -S localhost:8000
Тестируем маршруты
- Перейдите на главную страницу localhost:8000/
- Перейдите в localhost:8000/user/{id}, чтобы отобразить конкретного пользователя (замените {id} соответствующим ID пользователя)
- Используйте такой инструмент, как Postman или curl, чтобы протестировать POST localhost:8000/user
Проверим что 404 обрабатывается
Перейдите по несуществующему маршруту, чтобы проверить ответ 404.
Дополнительные улучшения
- Поддержка Middleware: Добавьте логику предварительной обработки запросов.
- Интеграция с контроллером: динамическое сопоставление маршрутов с методами контроллера.
- Обработка ошибок: Настройте ответы на ошибки для лучшего UX.
- Кэширование: Кэшируйте скомпилированные маршруты для повышения производительности.
- Необязательные параметры: Расширьте шаблоны маршрутов для обработки необязательных параметров или подстановочных знаков.
Следуя этому руководству, вы получите надежную и гибкую систему маршрутизации на нативном PHP. Она идеально подходит для небольших проектов или в качестве основы для изучения передовых концепций маршрутизации.
Comments
In order to leave your opinion, you need to register on the website