popov . dev

Main

Library

Articles

Создание эффекти...

Создание эффективного нативного 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