Сегодня рассмотрим приближенный к реальности пример использования атрибутов в PHP 8 . Предположим, что мы разрабатываем веб-приложение и хотим использовать атрибуты для маршрутизации HTTP-запросов. Создадим простой фреймворк, который будет использовать атрибуты для определения маршрутов и обработки запросов.

Простой пример маршрутизации на 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. Атрибуты позволяют явно описывать маршруты и методы, что делает код более читаемым и упрощает его поддержку. Этот подход можно расширить и адаптировать для более сложных сценариев и проектов.