PHP Микрофреймворк HLEB

Скачать Скачать c GitHub
Предназначение Установка Настройка Структура проекта Маршрутизация Типы маршрутов Группы маршрутов Защита маршрутов Конструктор страниц Контроллеры Модели Получение данных Базы данных Дополнительно

Контроллеры

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

Стандартный контроллер микрофреймворка HLEB - это обычный динамический класс PHP, методы которого используются для обработки входящих данных и возвращают результат в виде функции view(), html-строки, функции render() или редиректа на другой адрес. Поэтому к этому разделу инструкции стоит приступать после ознакомления с маршрутизацией и конструктором страниц, реализованных в данном микрофреймворке.

Стандартным контроллером, который взаимодействует с методом get(), подменяя его второй аргумент, является метод controller(). Вследствие чего он способен возвращать перечисленные функции и прочие указанные результаты по итогам обработки входных значений.

Метод controller()

Этот метод используется только в паре с методом get(), должен идти сразу за ним и применятся к конкретному методу get() один раз. Эти ограничения выходят из самого их взаимодействия, как уже упоминалось, метод controller() заменяет второй аргумент в методе get().

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

Например, имея простейший контроллер с таким содержимым:
// Файл /app/Controllers/TestController.php namespace App\Controllers; class TestController extends \MainController { function index() { if (/* Условие */){ return 'Возвращаемый результат'; } return view('/404'); } }
Можно использовать его в карте маршрутов:
Route::get('/')->controller('TestController');
В итоге все обращения к корневому адресу сайта будут проверены на соответствие заданному условию в контроллере, прежде чем будет возвращён результат.

Если в контроллере маршрута указано только название контроллера, вызов будет направлен методу index() класса контроллера, однако можно указать любой публичный метод контроллера. Например, если у контроллера "TestController" существовал бы метод checkCookies():
Route::get('/')->controller('TestController@checkCookies');
Данные для условия, которые доступны в классе контроллера, описаны в разделе «Получение данных», это объект Request c переменными из динамического маршрута, а также переданные с контроллером значения. В том числе, могут проверятся и вычислятся любые другие доступные данные, например, исходя из $_COOKIES, $_REQUEST, $_SESSION.

Переданные с контроллером значения предназначены для исключительного использования, представляют из себя массив с данными, передаваемый вторым необязательным аргументом в метод controller(). Сделано это для полноценной замены второго параметра метода get() маршрутизатора. Строковые ключи этого массива преобразуются в аргументы метода класса контроллера. Например, если бы вызов был:
Route::get('/')->controller('TestController', ['Значение id', 'Значение name']);
В классе "TestController" у метода index() в таком случае должны быть два принимающих аргумента:
// Файл /app/Controllers/TestController.php ... function index($id, $name) { ... } ...
Контроллеры стандартного типа чаще используются для предварительного получения данных, обращаясь к Модели(получение информации из базы данных в необходимом виде):
// Файл /app/Controllers/UserController.php namespace App\Controllers; use App\Models\UserModel; class UserController extends \MainController { function data() { $id = ... // Определение id текущего пользователя $data = UserModel::getData($id); return view('/user/profile', ['data' => $data]); } }

Методы before() и after()

Данные методы также относятся к контроллерам, но обращаются к классам-посредникам, располагаясь как до и после метода get(), так и между собой, вследствие этого применение их не ограничено в количестве для одного маршрута. Отличаются от метода controller() тем, что не возвращают результат, но производят необходимые проверки и могут включать в себя редирект на другой URL, если это метод before(), всегда применяемый до метода get(). Метод after() может быть использован для любых действий после определения вывода данных пользователю, например вывод информации в лог на основе этих данных или отправка её по E-mail. Теоретически, последнее может быть более рационально реализовано совместно с PHP-функцией ob_get_flush().

Классы этих посредников имеют место в папках "/app/Middleware/Before" и "/app/Middleware/After" соответственно. Преимущество данных методов перед controller() в возможном применении не только к маршруту, но и группе маршрутов.

Важно! Метод before() располагается до группы или маршрута, к которому применяется, а after() - таким же образом, после.

Route::before('TestMiddlewareBefore')->get('/', 'Выполнено действие до определения содержания индексной страницы.');
// Файл /app/Middleware/Before/TestMiddlewareBefore.php namespace App\Middleware\Before; class TestMiddlewareBefore extends \MainMiddleware { function index() { /* Обработка данных */ } }
Route::get('/', 'Индексная страница с последующим действием.')->after('TestMiddlewareAfter');
// Файл /app/Middleware/After/TestMiddlewareAfter.php namespace App\Middleware\After; class TestMiddlewareAfter extends \MainMiddleware { function index() { /* Обработка данных */ } }
Аналогично методу controller() посредники имеют второй необязательный аргумент, принимающий массив значений, и дополнительный разделитель "@", определяющий, в какой метод класса отправить вызов.

Пример определения авторизации для группы маршрутов:
// Файл /app/Middleware/Before/Auth/Authorization.php namespace App\Middleware\Before\Auth; class Authorization extends \MainMiddleware { function check() { if ( !( ... ) ){ // Здесь вместо (...) строгая проверка авторизации redirect(getByName('403')); } } }
Route::before('/Auth/Authorization@check')->getGroup(); Route::get('/map/', view('/project/map')); Route::get('/profile/')->controller('UserController@data'); Route::get('/messages/')->controller('MessagesController'); Route::endGroup(); Route::get('/403/', view('/errors/403')->name('403');




Предназначение Установка Настройка Структура проекта Маршрутизация Типы маршрутов Группы маршрутов Защита маршрутов Конструктор страниц Контроллеры Модели Получение данных Базы данных Дополнительно


HLEB - PHP Микрофреймворк Свободная лицензия. Без гарантий. © fomiash 2019