Ещё один пример того, как использовать атрибуты в PHP 8

Атрибуты в PHP 8 предоставляют стандартизированный способ добавления метаданных к вашим классам, методам, свойствам и параметрам. Эти метаданные затем могут быть получены и использованы во время выполнения. Вот пример использования атрибута в PHP 8:

Определение атрибута: Сначала определим наш собственный атрибут, который можно будет применять. Назовём его Route, данный атрибут предназначен для упрощения создания простого маршрутизатора для веб-приложения.

#[Attribute(Attribute::TARGET_METHOD)]
class Route {
    public function __construct(public string $path, public string $method = 'GET')
    {
    }
}

Применение атрибута: Затем применим этот атрибут к методу в нашем классе, который будет обрабатывать HTTP-запросы.

class WebController
{
    #[Route('/home', method: 'GET')]
    public function home()
    {
        return 'Добро пожаловать на главную страницу!';
    }

    #[Route('/about', method: 'GET')]
    public function about()
    {
        return 'О нас';
    }
}

Использование атрибутов в рантайме: Наконец, мы можем написать код, который читает эти атрибуты во время выполнения и использует их для решения, какой метод вызвать в зависимости от URL.

function handleRequest(string $uri): void
{
    $controller = new WebController();
    $refClass = new ReflectionClass($controller);

    foreach($refClass->getMethods() as $method) {
        $attributes = $method->getAttributes(Route::class);
        
        foreach($attributes as $attribute) {
            $route = $attribute->newInstance();
            
            if ($route->path === $uri) {
                echo $method->invoke($controller);
                return;
            }
        }
    }

    echo "404 Not Found";
}

// Пример вызова
handleRequest('/about'); // Выведет: О нас

В данном примере мы создали атрибут Route, использовали его для аннотации методов в WebController, а затем написали функцию handleRequest, которая корректно вызывает нужный метод в зависимости от запрашиваемого URI.

Это простой пример, демонстрирующий мощь атрибутов PHP 8 в реализации метаданных и их использовании в рантайме для управления поведением приложения.

Loading

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *