Документация/Контроллеры/Контроллер

Контроллер

Контроллер — часть архитектуры MVC (Action-Domain-Responder для веб), отвечает за дальнейшее управление обработкой запроса, уже идентифицированного маршрутизатором, но не должен содержать бизнес-логику.

Во фреймворке HLEB2 контроллерами являются обычные классы-обработчики, привязанные к маршруту методом controller().
Этот метод указывает на класс контроллера и его выполняемый метод. При совпадении — фреймворк создаёт объект этого класса и вызывает метод.

Класс контроллера должен быть унаследован от Hleb\Base\Controller.

Фреймворк производит поиск контроллера в папке /app/Controllers/ согласно его namespace. Вот код контроллера по умолчанию:

<?php

namespace App\Controllers;

use 
Hleb\Base\Controller;
use 
Hleb\Constructor\Data\View;

class 
DefaultController extends Controller
{
    public function 
index(): View
    
{
        return 
view("default");
    }
}

В примере метод 'index' контроллера возвращает объект View, сформированный функцией view() и указывающий на шаблон из папки /resources/views/.
Будет использован шаблон /resources/views/default.php
Это простой пример, так как можно использовать эту функцию аналогичным образом в маршруте.


#Функция view()

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

view('/template/file', ['title' => 'Main template''description' => 'Template description'], 205);

Если использовать этот пример в контроллере, то будет вызван шаблон /resources/views/template/file.php.
В файле будут доступны переменные $title и $description c соответствующими значениями:

<?php
// File /resources/views/template/file.php

/**
 * @var string $title
 * @var string $description
 */
echo $title// Main template
echo $description// Template description

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


#Возвращаемые значения

Кроме уже упомянутого объекта View, из метода контроллера могут возвращаться и другие типы значений:

string|int|float - эти типы будут преобразованы в строку и выведены в исходном виде как текст.

array - возвращаемый массив будет преобразован в JSON-строку.

bool - если возвращается false, то будет выведена стандартная ошибка 404.

Объект (из контейнера) с интерфейсом Hleb\Reference\ResponseInterface - будет преобразован в ответ.

Объект с интерфейсом Psr\Http\Message\ResponseInterface - будет преобразован в ответ.

При ответе массивом как JSON на запрос GET может возникнуть XSSI перехват JSON, поэтому лучше отправить именованный массив, который преобразуется в объект как JSON.


#Подстановка динамических переменных

Вместе с динамическим маршрутом могут быть определены значения фреймворком, совпадающие с именованными частями URL. Например, для следующего маршрута:

use App\Controllers\DefaultController;

Route::get('/resource/{version}/{page?}/')
    ->
where(['version' => '[0-9]+''page' => '[a-z]+'])
    ->
controller(DefaultController::class, 'resource');

Переменные $version и $page могут быть подставлены в метод контроллера 'resource'.

<?php

namespace App\Controllers;

use 
Hleb\Base\Controller;

class 
DefaultController extends Controller
{
    public function 
resource(int $version, ?string $page null): void
    
{
        
// ... //
    
}
}

#Использование другого контроллера

Из одного контроллера можно вернуть данные другого, только при этом должны совпадать типы возвращаемых данных.

<?php

namespace App\Controllers;

use 
Hleb\Base\Controller;

class 
DefaultController extends Controller
{
    public function 
index(): mixed
    
{
        return (new 
OtherController($this->config))->index();
    }
}

Для этого вложенного контроллера не будет применено ни одно Событие, из назначенных контроллерам.


#Создание контроллера

Кроме копирования демонстрационного файла DefaultController.php и его изменения, есть еще один простой способ создания контроллера с использованием консольной команды.

$php console --add controller ExampleController

Эта команда создаст новый шаблон контроллера /app/Controllers/ExampleController.php.
Можно использовать другое подходящее название для класса.
Фреймворк позволяет также создать собственный шаблон по умолчанию для этой команды.

Маршрутизация Модуль

Страница создана: @fomiash
К началу страницы