Простой пример маршрутизации на PHP8 атрибутах
Сегодня мы рассмотрим приближенный к реальности пример использования атрибутов в PHP 8. Предположим, что мы разрабатываем веб-приложение и хотим использовать атрибуты для маршрутизации HTTP-запросов. Мы создадим простой фреймворк, который будет использовать атрибуты для определения маршрутов и обработки запросов.
Пример: Маршрутизация с использованием атрибутов
1. Создание атрибутов
Сначала создадим атрибуты для маршрутизации. Мы создадим атрибуты для различных HTTP-методов, таких как GET, POST, PUT, и DELETE.
#[Attribute(Attribute::TARGET_METHOD)]
class Route
{
public function __construct(public string $path, public string $method) {}
}
#[Attribute(Attribute::TARGET_METHOD)]
class Get extends Route
{
public function __construct(string $path)
{
parent::__construct($path, 'GET');
}
}
#[Attribute(Attribute::TARGET_METHOD)]
class Post extends Route
{
public function __construct(string $path)
{
parent::__construct($path, 'POST');
}
}
#[Attribute(Attribute::TARGET_METHOD)]
class Put extends Route
{
public function __construct(string $path)
{
parent::__construct($path, 'PUT');
}
}
#[Attribute(Attribute::TARGET_METHOD)]
class Delete extends Route
{
public function __construct(string $path)
{
parent::__construct($path, 'DELETE');
}
}
2. Создание контроллера
Теперь создадим контроллер, который будет использовать эти атрибуты для определения маршрутов.
class UserController
{
#[Get('/users')]
public function getUsers()
{
return ['user1', 'user2', 'user3'];
}
#[Post('/users')]
public function createUser(array $data)
{
// Логика создания пользователя
return ['status' => 'User created'];
}
#[Put('/users/{id}')]
public function updateUser(int $id, array $data)
{
// Логика обновления пользователя
return ['status' => 'User updated'];
}
#[Delete('/users/{id}')]
public function deleteUser(int $id)
{
// Логика удаления пользователя
return ['status' => 'User deleted'];
}
}
3. Парсинг атрибутов и обработка запросов
Теперь создадим класс, который будет парсить атрибуты и обрабатывать запросы.
class Router
{
private array $routes = [];
public function __construct(private string $controllerClass)
{
$this->parseRoutes();
}
private function parseRoutes()
{
$reflectionClass = new ReflectionClass($this->controllerClass);
$methods = $reflectionClass->getMethods();
foreach ($methods as $method) {
$attributes = $method->getAttributes(Route::class);
foreach ($attributes as $attribute) {
$instance = $attribute->newInstance();
$this->routes[$instance->method][$instance->path] = $method->getName();
}
}
}
public function dispatch(string $method, string $path)
{
if (isset($this->routes[$method][$path])) {
$methodName = $this->routes[$method][$path];
$controller = new $this->controllerClass();
return $controller->$methodName();
}
return ['status' => 'Not Found'];
}
}
4. Использование роутера
Теперь мы можем использовать наш роутер для обработки запросов.
$router = new Router(UserController::class);
// Пример обработки GET-запроса
$response = $router->dispatch('GET', '/users');
print_r($response); // Выведет: Array ( [0] => user1 [1] => user2 [2] => user3 )
// Пример обработки POST-запроса
$response = $router->dispatch('POST', '/users');
print_r($response); // Выведет: Array ( [status] => User created )
Заключение
В этом примере мы создали простой фреймворк для маршрутизации HTTP-запросов с использованием атрибутов в PHP 8. Атрибуты позволяют явно описывать маршруты и методы, что делает код более читаемым и упрощает его поддержку. Этот подход можно расширить и адаптировать для более сложных сценариев и проектов.
Еще больше о PHP можно узнать в моем курсе - Система "PHP и MySQL с Нуля до Гуру 3.0"
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.