Простой пример маршрутизации на 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"
- 
					Создано 24.12.2024 08:31:18  
- 
					 Михаил Русаков Михаил Русаков
 
			 
			 
		 
				 
			 
				 
				 
				 
				
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.