Введение
Контроллер (обработчик) - это компонент системы, ответственный за формирование страницы в соответствии с запросом пользователя. После обработки запроса пользователя маршрутизатор находит соответствующий контроллер и передает ему управление. Контроллер должен далее сформировать и выдать страницу.
Структура файлов
Все контроллеры находятся в папке ./handlers/. В зависимости от типа маршрута контроллеры располагаются в подпапках:
- dynamic - обработчики динамичного маршрута
- static - обработчики статичного маршрута
- error - обработчики ошибок
Каждый контроллер располагается в отдельной папке, которая называется так же как и сам контроллер. Сам контроллер находится в файле с расширением .php, поэтому в папке должен находится только один файл с данным расширением. Остальные файлы в папке контроллера являются вспомогательными (шаблоны, стили, js-скрипты и т.д.).
Структура контроллера
Контроллер является классом, производным от класса BaseController. Наипростейший контроллер можно разделить на две части:
- Инициализация (конструктор)
- Обработчики (публичные методы)
В конструкторе, в частности, можно определить правила для принимаемых параметров контроллером. То есть в каком виде допускается часть URL, которая может быть переведена в параметры. Обработчики выполняют основную функцию контроллера - формируют и возвращают страницу.
Правила перевода параметров
Правила перевода параметров
Дополнительной частью URL назовем часть URL за вычетом хоста и адреса контроллера. К примеру:
URL: http://example.com/my/blog/11/comments/
Хост: http://example.com/
Контроллер: my/blog/
Дополнительная часть URL: 11/comments
Правила перевода параметров контроллера устанавливают шаблон для дополнительной части URL и правило, по которому она должна быть переведена в параметры. Правило устанавливается через метод BaseController::addRule(). Каждое отдельное правило имеет следующий вид:
'имя' => 'шаблон URL: имена параметров'//Пример 1.
Framework::import('patterns.BaseController'); // подключаем базовый контроллер
class BlogController extends BaseController
{
public function __construct()
{
parent::__construct(); // вызываем конструктор из базового контроллера
// добавляем следующее правило с именем entry:
// для URL вида 'http://example.com/blog/101/' при адресе контроллера '/blog/' транслировать параметр '101' в переменную 'id'
$this->addRule(
array(
'entry' => '(\d+): id'
)
);
}
}В указанном примере, после применения правила появятся переменные окружения: $Conf->ENV->action = 'entry', $Conf->ENV->id = 101
Вызов обработчика
Контроллер может иметь несколько обработчиков-методов. Имя каждого метода должно начинаться с 'handler'. Имя метода должно соответствовать шаблону:
handle[тип HTTP запроса][действие]Тип HTTP запроса может быть: Get/Post/Put/Delete, а действие должно совпадать с именем правила перевода параметра, которое было применено при маршрутизации. Например, метод: handeGetEntry() будет обрабатывать GET запросы соответствующие правилу entry.
При это возможны следующие варианты:
- Действие по умолчанию - Default, если никакое правило не было применено, то действует обработчик по умолчанию. Например: handleGetDefault()
- Обрабатывать все типы запросов заданного действия - если нужно обрабатывать любой тип HTTP запросов, то тип можно опустить. Например: handleEntry()
- Обрабатывать все действия по заданному типу запроса - устанавливает обработчик для всех действий по заданному HTTP запросу. Например: handleGet()
- Обрабатывать все действия по любому типу запроса - метод должен называться только handle()
Маршрутизатор при выборе метода будет сперва искать более специфичные методы, а затем более расширенные. То есть сначала будет проверяться наличие метода, обрабатывающего конкретный тип запроса и конкретное действие, а последним будет проверяться наличие метода handle().