Создание сайта с помощью фреймворка HLEB. Часть 2. Добавление маршрутов (роутинг).

17 Сентября 2022 (ред)

В предыдущей части Планирование и Установка были разобраны темы "как всё это будет происходить" и по установке PHP микрофреймворка HLEB, на котором и будем разрабатывать демонстрационный сайт.

Маршрутизация

Маршрутизация фреймворка - это распределение запросов пользователей из частей URL по назначенным в ней контроллерам и шаблонам. Чтобы задать эти правила нужно изменить файл с роутами (или маршрутами, здесь в тексте не имеет принципиальной разницы).

Вам будет проще читать далее, если ознакомитесь с оригинальной инструкцией по маршрутизации в документации фреймворка.

В папке с установленным и работающим фреймворком откройте папку routes, если фреймворк только установлен, то там один файл main.php, осуществляющий роутинг. Правда, легко запомнить, /routes/main.php? Этот файл (и другие файлы в папке) довольно важный для проекта, в нем содержаться так называемые endpoints, точки входа для запросов пользователей, API и тд.

По сути здесь (в папке routes) реализована прямая и обратная связь с внешним миром, и структура маршрутизации планировалась так, чтобы по одному взгляду на файл маршрутизации можно было составить представление о самом проекте. Вернёмся к содержимому файла main.php. Подразумевается, что вы его открыли в своей любимой (или нелюбимой, если вас заставили) IDE и теперь ждёте продолжения.

Продолжение. Для создания страниц Home page (Главная страница), Contacts (Контакты), User (Страница пользователя) и Privacy Policy (Политика конфиденциальности) замените единственный маршрут в файле на следующий код:

use Phphleb\Hlogin\App\System\UserRegistration as RegType;
/*
 В группе содержатся маршруты, которые видны всем пользователям, кроме заблокированных,
 и по умолчанию выводятся кнопки базовой регистрации.
*/
Route::before('Hlogin\Registrar', [RegType::UNDEFINED_USER, '>='])->getGroup();

    /*  Home page (Главная страница)  */
    Route::get('/')->controller('PageController@home')->name('homepage');

    /* Contacts (Контакты) */
    Route::get('/contacts')->controller('PageController@contacts')->name('contacts');

    /* User (Страница пользователя) */
    Route::get('/user/{user_id}')->controller('PageController@user')->where(['user_id' => '[0-9]+'])->name('user');

Route::endGroup();

/* Privacy Policy (Политика конфиденциальности)) */
Route::get('/privacy-policy', view("privacy-policy"))->name('privacy.policy');

/* Like (Добавление лайка зарегистрированного пользователя) */
Route::protect()->post('/likes/add')->controller('AjaxController@userLike');

Теперь по очереди рассмотрим эти роуты:

Home page - главная страница. Направлено в контроллер PageController метод home. Информация о контроллерах будет в следующих статьях. HTTP-метод GET (по названию типа Route::get(...)).

Contacts - страница с контактами владельца сайта. Направлено в контроллер PageController метод contacts. HTTP-метод GET.

User - публичная страница с необходимой информацией о конкретном пользователе. . И сколько раз он лайкнул. Спокойно, шутка. Эта информация конфиденциальная. Заметьте, вторая часть запроса имеет вид {user_id}, в это место будет передаваться id пользователя, а во фреймворке мы его перехватим в контроллере по идентификатору "user_id". Также видно, что метод where проверяет значение с помощью регулярного выражения (вследствие можно только цифры). HTTP-метод GET.

Privacy Policy - страница с Политикой сайта, где как раз указывается, что пользователь дает разрешение использовать его данные и отображать количество его лайков. Не использует контроллер, напрямую выведен шаблон из /resources/views/privacy-policy.php. HTTP-метод GET.

Like - страница для выполнения AJAX-запроса. Обратите внимание, что она отличается от User, вместо Route::get использовано Route::post, соответственно, HTTP-метод POST. Ещё обратите внимание на указание protect() в маршруте, это значит, что он будет защищён CSRF-токеном. Ещё использован другой контроллер - AjaxController, метод userLike. Этот роут имеет принципиально иное предназначение, поэтому он отделён в другой контроллер.

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

Также вы скорее всего заметили, что использованы ещё действия с названием name. Это в дальнейшем будет использовано в коде для получения адреса маршрута. Зачем это нужно? В фреймворке можно, в частности, задать окончание URL, поэтому лучше генерировать ссылку, чем ожидать редиректы. Да и так проще, меняется часть роута, не надо переписывать везде, так как он вызывается по имени.

И, собственно, про то, что встретилось первым в этом примере, это группа. В группу можно заключать маршруты и назначать им общее действие. Здесь добавлен контроллер-посредник Hlogin\Registrar (задаёт условия регистрации пользователей), код которого выполнится до назначенного в роуте. Границы группы обозначены Route::getGroup() и Route::endGroup(). К подключению регистрации вернёмся позднее.

Скачать все файлы урока в ZIP-архиве

Предыдущая статья

В начало

Продолжение. Часть 3

fomiash fomiash + 221
Опубликовано в PHP фреймворк HLEB

2 Ответа

  1. YuraN YuraN 17 Ноября 2022
    Route::before('Hlogin\Registrar', [RegType::UNDEFINED_USER, '>='])->getGroup();

    Если не трудно - поясните пожалуйста, что в этой строке каждый элемент означает?

  1. fomiash fomiash 18 Ноября 2022
    Route::before(

    Задаётся middleware, то есть предварительный (before) контроллер, размещённый до группы маршрутов или маршрута. В данном случае первое, он назначен группе, значит будет выполнен до любого совпавшего маршрута в группе.

    'Hlogin\Registrar',

    Это сам вышеупомянутый класс-контроллер библиотеки Hlogin(в данной инструкции установка библиотеки - на одном из следующих этапов), при установке библиотеки он размещается по пути /app/Middleware/Before/Hlogin/Registrar.php. Выполняясь до маршрута он реализует проверку авторизации.

    [RegType::UNDEFINED_USER, '>=']

    Параметры проверки на авторизацию, например здесь RegType::UNDEFINED_USER - означает, что установлено значение любой пользователь (кроме заблокированных и удалённых), а знак '>=' соответственно одобряет проверку текущему значению и всем более "высоким" статусам регистрации, авторизованным и администратору. Значения сравниваются такие (по возрастанию):

    BANNED_USER - Забаненный

    DELETED_USER - Удалённый

    UNDEFINED_USER - Не определённый (любой не авторизованный и не удалённый/забаненный)

    PRIMARY_USER - Не подтвердивший E-mail(но авторизованный)

    REGISTERED_USER - Зарегистрированный

    REGISTERED_COMANDANTE - Суперадмин

    При регистрации пользователю устанавливается PRIMARY_USER, после подтверждения E-mail - REGISTERED_USER, если пользователь попробует зайти на страницу(из маршрута для которого задана проверка авторизации) - при этом с недостаточным уровнем пользователя - его перебросит на страницу авторизации. Зачем добавлять этот контроллер для незарегистрированных (публичные страницы)? На этих маршрутах добавиться блок регистрации, иначе маршрут будет "вне видимости" библиотеки Hlogin.

    )->getGroup();
    ...
    Route::endGroup();

    Сама группа маршрутов, на которую назначается условие (контроллер).

    use Phphleb\Hlogin\App\OriginData as RegData;
    use Phphleb\Hlogin\App\System\UserRegistration as RegType;
    Route::before('Hlogin\Registrar', [RegType::PRIMARY_USER, '>=', RegData::HIDE_PANELS])
        ->get("/api/test", '{"success":1}');

    Выше показано, как можно скрыть блок авторизации/профиля, при этом оставив проверку, это может пригодится для API только для зарегистрированных, например. RegData::HIDE_PANELS - скрывает блок. В версии HLOGIN v1.2.35 и выше можно добавить RegData::FROM_API, тогда редиректа не произойдёт и вернётся ошибка 403.



Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.