Введение

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

Структура файлов

Все контроллеры находятся в папке ./handlers/. В зависимости от типа маршрута контроллеры располагаются в подпапках:

  • dynamic - обработчики динамичного маршрута
  • static - обработчики статичного маршрута
  • error - обработчики ошибок

Каждый контроллер располагается в отдельной папке, которая называется так же как и сам контроллер. Сам контроллер находится в файле с расширением .php, поэтому в папке должен находится только один файл с данным расширением. Остальные файлы в папке контроллера являются вспомогательными (шаблоны, стили, js-скрипты и т.д.).

Структура контроллера

Контроллер является классом, производным от класса BaseController. Наипростейший контроллер можно разделить на две части:

  1. Инициализация (конструктор)
  2. Обработчики (публичные методы)

В конструкторе, в частности, можно определить правила для принимаемых параметров контроллером. То есть в каком виде допускается часть 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.
При это возможны следующие варианты:

  1. Действие по умолчанию - Default, если никакое правило не было применено, то действует обработчик по умолчанию. Например: handleGetDefault()
  2. Обрабатывать все типы запросов заданного действия - если нужно обрабатывать любой тип HTTP запросов, то тип можно опустить. Например: handleEntry()
  3. Обрабатывать все действия по заданному типу запроса - устанавливает обработчик для всех действий по заданному HTTP запросу. Например: handleGet()
  4. Обрабатывать все действия по любому типу запроса - метод должен называться только handle()

Маршрутизатор при выборе метода будет сперва искать более специфичные методы, а затем более расширенные. То есть сначала будет проверяться наличие метода, обрабатывающего конкретный тип запроса и конкретное действие, а последним будет проверяться наличие метода handle().