<MyRusakov.ru />

Финансовая грамотность от А до Я

Финансовая грамотность от А до Я

Данный курс в кратчайшие сроки обучит Вас финансовой грамотности. Эти знания позволят Вам получить, как минимум, серьёзную финансовую стабильность, а, как максимум, финансовую независимость.

В рамках курса даётся большое количество практических заданий, благодаря которым Вы не просто посмотрите курс, а действительно выполните ряд важнейших шагов, о которых в нём говорится.

Помимо самого курса Вас ждёт ещё бесплатный ценный Бонус: «Ранний выход на пенсию». В рамках этого Бонуса Вы узнаете, какой должен быть капитал конкретно в Вашем случае, варианты его получения, а также какие есть стратегии вывода капитала на пенсии и где их можно протестировать.

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Роутинг в PHP на основе аннотаций

Роутинг в PHP на основе аннотаций

В данном скрипте я Вам покажу как из аннотаций можно получать настройки для системы маршрутизации в Вашем проекте. Преимущество настройки маршрутизации на основе PHP аннотаций заключается в том, что Вам не нужно больше создавать дополнительные файлы в которых будут прописываться конфигурации. Все конфигурации находятся прямо перед методом, избавляя нас от необходимости искать их где-то еще. В общем, много говорить не буду, а просто оставлю здесь код. Кстати, в данном примере используется компонент doctrine/annotations, который и ответственен за всю логику парсинга аннотаций.

Сначала создаем файл composer.json:

{
    "require": {
        "doctrine/annotations": "*"
    }
}

Далее в этой же папке выполняем команду

composer install

Создаем файл index.php, первые строки которого выглядят так:

<?php
    
    // подключаем автозагрузчик Composer'a
    require_once 'vendor/autoload.php';

Далее в этом же файле создаем класс аннотации @Route:

    /**
    * Аннотация \@Route представлена классом Route (маршрут)
    * Данная аннотация хранит настройки маршрутизации
    *
    *
    * @Annotation - обозначение аннотации
    * @Target({"CLASS","METHOD"}) - аннотация может применяться только к классам и методам классов
    */
    class Route
    {
        public $url;     // url маршрута
        public $handler; // обработчик - метод класса
        public $methods;
    }

Далее добавляем тестовый контроллер:

// пример контроллера
    // у каждого метода аннотация \@Route
    // содержит параметры 
    // в виде ключ => значение, где ключ - это свойство класса, 
    // а значение - сторока в кавычках, число, или массив
    class PageController
    {
        /**
        * @Route(
        *   url = "/",
        *   handler = "PageController::index",
        *   methods = {"GET"}
        * )
        */
        public function index() {
            print __METHOD__;
        }
        
        
        /**
        * @Route(
        *   url = "/login",
        *   handler = "PageController::login",
        *   methods = {"GET"}
        * )
        */
        public function login() {
            print __METHOD__;
        }
        
        
        /**
        * @Route(
        *   url = "/article/{id:\d+}",
        *   handler = "PageController::article",
        *   methods = {"GET"}
        * )
        */
        public function article($id) {
            print __METHOD__;
        }
        
        
        public function stub() {
            print __METHOD__;
        }
    }

Класс RouteCollector

// класс собирает все маршруты в массив
    class RouteCollector
    {
        // метод получает на вход строковое имя класса
        // который содержит роуты
        public function collect($class) 
        {
            // объект класса AnnotationReader  из пакета doctrine/annotation
            $reader    = new Doctrine\Common\Annotations\AnnotationReader();
            
            // загружаем класс в объект ReflectionClass
            $refClass  = new ReflectionClass($class);
            
            // получаем из класса все публичные методы
            $refMethods = $refClass -> getMethods(ReflectionMethod::IS_PUBLIC);
            
            // массив полученных объектов Route, описывающих маршрут
            $routes = [];
            foreach($refMethods as $method)
            {
                // получаем аннотацию Route
                $annotation = $reader -> getMethodAnnotation($method,Route::class);
                
                // если есть аннотация
                if($annotation) 
                    $routes[] = $annotation;
            }
            
            return $routes;
        }
    }

Вызываем все это дело так:

// создаем класс коллектора
    $collector = new RouteCollector();
    
    // собираем маршруты с класса
    $routes = $collector -> collect(PageController::class);
    
    // выводим маршруты
    print_r($routes);

Результат примерно следующий:

Array
(
    [0] => Route Object
        (
            [url] => /
            [handler] => PageController::index
            [methods] => Array
                (
                    [0] => GET
                )

        )

    [1] => Route Object
        (
            [url] => /login
            [handler] => PageController::login
            [methods] => Array
                (
                    [0] => GET
                )

        )

    [2] => Route Object
        (
            [url] => /article/{id:\d+}
            [handler] => PageController::article
            [methods] => Array
                (
                    [0] => GET
                )
        )
)

Вот так можно организовать конфигурацию маршрутов в PHP с помощью аннотаций.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (4):

Dmitriy Dmitriy 25.07.2019 18:41:54

у вас опечатка - исправьте в "Сначала создаем файл" comoser.json - на composer.json

Ответить

Castels Castels 29.06.2021 11:03:45

Исправлено.

Ответить

romas_s romas_s 28.06.2021 17:27:00

Скажите пожалуйста, а зачем этот метод лучше следующего метода: route.php Хранит в себе все типы контента( статья, категория, меню сайта и т д) + условия подключения разных шаблонизаторов вывода контента. url.xml - список урл + id элементов с базы данных. route.php - вызывается в главном index php. Универсальный способ сортировать ссылки + не нужно костыли создавать, для обхода ограничений роутинга по шаблонному классу аннотаций.

Ответить

Castels Castels 29.06.2021 11:02:54

Покажите, пожалуйста, Ваш пример кода, с Github, например, так трудно представить, что имеется ввиду. А код в статье - это, один из вариантов роутинга, из фреймворка Symfony.

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.