Создание сайта с помощью фреймворка HLEB. Часть 6. Подключение контроллеров.

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

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

Следующим шагом создадим контроллеры, согласно назначенным в файле маршрутизации.

Контроллеры

У нас их два, первый обрабатывает основные страницы и, так как он побольше, начнём с него.

Контроллер фреймворка представляет собой класс, отнаследованный от \MainController и содержит методы, которые были назначены ранее. Например, мы установили такую зависимость:

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

В первой части назначается какой именно URL отвечает за маршрутизацию, здесь это you-domain.ru/contacts. Route::get(...) означает, что запрос будет выполнен HTTP-методом GET. Дальше подключается контроллер, его название PageController и метод contacts.

Именование контроллера в роуте всегда подразумевает, что файл находится в папке /app/Controllers/, если бы мы расположили его в папке /app/Controllers/Example, то и в маршруте указали бы как Example/PageController, а namespace класса был бы соответственно /App/Controllers/Example.

От воображаемых контроллеров вернёмся к практике, необходимо создать следующий файл с содержимым:

<?php

/* Файл /app/Controllers/PageController.php */

namespace App\Controllers;

use App\Models\LikeModel;
use App\Models\UserModel;
use Phphleb\Hlogin\App\System\UserRegistration;

class PageController extends \MainController
{
    /**  Home page (Главная страница)  */
    public function home()
    {
        /* Получение данных из Модели (таблица users) */
        $data = UserModel::getUserTopByLimit();

        /* Получение id текущего пользователя или null, если не авторизован  */
        $userId = UserRegistration::getUserId();

        /* Получение количества лайков для текущего пользователя */
        $userCount = $userId ? LikeModel::get($userId) : null;

        /* Добавление стилей и скриптов в нижней части страницы */
        $this->addResources();

        /* Возвращение шаблона с инициализированной переменной в качестве $data */
        return view("home", ['data' => $data, 'user_count' => $userCount]);
    }

    /** Contacts (Контакты) */
    public function contacts(){
        /* Добавление стилей и скриптов в нижней части страницы */
        $this->addResources();

        /* Возвращение шаблона из папки /resources/views/ */
        return view("contacts");
    }

    /** User (Страница пользователя) */
    public function user() {
        /* Получение переменной из URL-адреса. */
        $userId = \Request::get("user_id");

        /* Пример проверки переменной, попробуйте передать '0' */
        if (!$userId) {
            return view("404");
         }
        /* Получение данных из Модели (таблица users) */
        $data =  UserModel::getUserPublicData($userId);

        /* Получение данных из Модели (таблица likes) */
        $likeCount = LikeModel::get($userId);

        /* Добавление стилей и скриптов на страницу */
        $this->addResources();

        /* Возвращение шаблона с инициализированными переменными в качестве $data и $like_count */
        return view("user", ['data' => $data, 'like_count' => $likeCount]);
    }

    private function addResources() {
        /* Добавляет стиль для вывода на странице */
        \Request::getHead()->addStyles('/css/main.css');

        /* Добавляет скрипт для вывода на странице */
        \Request::getResources()->addBottomScript("/js/main.js");
    }

}

Если вы попробовали детально изучить этот код и понять, что там происходит, то, скорее всего, некоторые участки, вроде вызова Request, показались ранее не изученными. Закроем этот пробел.

Request::get("user_id") - получение переменной из запроса, которая отвечает за конкретный ID пользователя, напомню, ранее мы назначили:

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

Как видно, user_id встречается дважды, в условиях get и where. В первом происходит сопоставление частей URL с роутом (то, что попадает в Request::get()), во втором проверка приходящего значения, обозначенного как user_id по регулярному выражению.

Request::getHead()->addStyles('/css/main.css') - в следующих статьях мы создадим файлы стилей и js-скриптов, в этом месте путь до файла стилей добавляется в объект Request, чтобы быть выведенным в блок head страницы при помощи другого метода Request.

Request::getResources()->addBottomScript("/js/main.js") - аналогично стилям здесь добавляется js-скрипт, но только уже в конец страницы. Его можно вывести и в head и указать загрузку как async, но, так как мы делаем демонстрационный проект, продемонстрированы разные варианты.

return view("user", ['data' => $data, 'like_count' => $likeCount]) - из контроллера возвращается и отображается на странице файл /resources/views/user.php, его мы добавим в одной из следующих тем. Массив будет преобразован в переменные, доступные в файле. Кстати, если вернуть из контроллера массив, то он будет преобразован в JSON, а если возращается false, то это равносильно exit (выходу из программы).

Теперь добавим файл с запросом AJAX, где как раз продемонстрированы другие возвращаемые значения из контроллера:

<?php

/* Файл /app/Controllers/AjaxController.php */

namespace App\Controllers;

use App\Models\LikeModel;
use Phphleb\Hlogin\App\System\UserRegistration;

class AjaxController extends \MainController
{
    /** Like (Добавление лайка зарегистрированного пользователя) */
    public function userLike() {
        /* Определяется ID пользователя или null, если не зарегистрирован */
        $userId = UserRegistration::getUserId();
        if ($userId) {
            /* Добавление одного лайка к текущему количеству у пользователя (возвращает итоговый результат) */
          $addLike = LikeModel::add($userId);

          /* Возвращаем массив с данными (преобразуется фреймворком в JSON) */
          return ["count" => $addLike, "user_id" => $userId];

        } else {
            /* Фреймворк прекращает выполнение при возврате false, это значение возвращено, так как пользователь должен быть зарегистрирован и это явно в обход правила */
            return false;
        }
    }
}

Напомню, для чего второй контроллер: так как нужно обновлять количество лайков на странице, в него отправляется защищённый POST-запрос, который не только изменяет количество лайков у текущего пользователя, но и возвращает результат. Код с этим контроллером, назначенный ранее:

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

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

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

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

В начало

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

fomiash fomiash + 221
Опубликовано в PHP фреймворк HLEB
Для ответа вы можете авторизоваться


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