В приложении MVC, таком как Invision Community, задача контроллера заключается в обработке запросов от пользователей. Он, по своей сути, является посредником, запрашивая данные от модели, делая необходимую обработку и передавая их в представление для отображения (шаблоны) или вывода других данных.
Как описано в документе Маршрутизация и URL-адреса, методы в контроллерах напрямую сопоставляются с URL-адресом. Когда вы посещаете URL-адрес, к примеру такой - community.ru/index.php?app=core&module=messenger&controller=messenger, то контроллер /applications/core/modules/front/messenger/messenger.php инициализируется для обработки запроса.
Все контроллеры расположены в директории /modules приложения. Эта директория имеет две поддиректории.
- /front - для модулей, которые обрабатывают фронэнд (общедоступные) функциональные возможности.
- /admin - для модулей, которые обрабатывают функциональность админцентра.
Админ контроллеры могут быть доступны только при авторизации пользователя в учетную запись с правами администратора.
Анатомия контроллера
Базовый контроллер:
<?php namespace IPS\core\modules\front\example; class _example extends \IPS\Dispatcher\Controller { public function manage() { //... } public function otherMethod() { echo "Hello world"; //... } }
В этом примере наш контроллер называется 'example'. В результате он сохраняется в файле с именем example.php, что позволяет Invision Community находить его. Наше пространство имён (namespace) должно быть IPS\<app>\modules\<location>\<module>, где app это ключ вашего приложения, location - либо admin, либо front, a module это название модуля, которому принадлежит этот контроллер.
Как написано в документе Автозагрузка классов, имя класса контроллера должно быть строчным (совпадающее с именем файла) и с префиксом подчеркивания; это позволяет Invision Community правильно находить и загружать ваш контроллер, когда это необходимо. Как минимум, контроллеры должны расширять \IPS\Dispatcher\Controller. Существуют другие классы, которые вы можете расширить для дополнительной функциональности, о чем будет сказано ниже.
Методы внутри контроллера являются обработчиками запросов и вызывается, когда параметр do в URL-адресе совпадает с названием метода. В нашем примере выше, URL-адрес community.ru/index.php?app=core&module=example&controller=example&do=otherMethod будет выведена надпись "Hello world".
Специальные методы
Метод execute в контроллере запускается для каждого запроса к обработчику в этом контроллере. Это означает, что это хорошее место для выполнения чего-либо, что применяется ко всем обработчикам - включение CSS или JS файлов для модуля, например. Если вы определяете метод execute() в своем контроллере, вы всегда должны вызывать родителя:
public function execute ()
{
// Ваш код...
parent::execute();
}
Метод manage() это обработчик по умолчанию в контроллере. Если в URL-адресе не передаётся какой-либо параметр - будет вызван метод method().
Методы без запроса
Если у вашего контроллера есть методы, которые не являются обработчиками запросов (например, методы утилит), вы должны указывать префикс подчеркивание перед их названием. Эти методы недоступны по URL-адресу, как стандартные методы.
protected function _someHelper ()
{
// Метод, который наши обаработчики запроса могут вызывать
}
Расширенные контроллеры
Хотя большинство контроллеров расширяют класс \IPS\Dispatcher\Controller, существуют другие контроллеры, которые могут быть расширены вместо этого, чтобы обеспечить дополнительную функциональность (и они, в свою очередь, сами расширяют \IPS\Dispatcher\Controller). Вот они:
- \IPS\Node\Controller - Управляет функциональностью для нод - древовидные структуры данных, широко используемые в Invision Community.
- \IPS\Content\Controller - Дополнительная функциональность для элементов контента Invision Community.
- \IPS\Api\Controller - Обрабатывает запросы API (этот контроллер не расширяет \IPS\Dispatcher\Controller).
Эти контроллеры будут рассмотрены более подробно в следующих документах.
Защита от CSRF-атак
CSRF (Межсайтовая подделка запроса) - это тип веб-атаки, когда пользователь совершает действия, которые он не намеревался выполнять. Чтобы защитить от этого типа атаки, для каждого пользователя создается уникальный ключ, который должен быть включён с действиями, которые делают изменения состояния, а затем проверяется до того, как эти изменения будут сохранены. Invision Community облегчает защиту.
Любой URL-адрес, который выполняет изменение состояния (например, обновляет значение в базе данных или удаляет строку в базе данных), должен выполнить проверку CSRF перед тем, как внести это изменение. Первым шагом является включение ключа CSRF пользователя в URL-адрес обработчика контроллера.При использовании класса \IPS\Http\Url для создания URL-адреса, вы можете сделать это легко, вызвав ->csrf(). Если вы создаете URL-адрес с помощью помощника шаблонов, вы можете просто передать csrf="true" в теге. Пример:
$url = \IPS\Http\Url::internal( "app=application&module=foo&controller=bar" )->csrf();
{url="app=application&module=foo&controller=bar" csrf="true"}
Это добавить параметр &csrfKey=(unique key) к URL-адресу, который вы можете легко проверить в своем методе контроллера следующим образом:
\IPS\Session::i()->csrfCheck();
Этот метод автоматически покажет ошибку, если ключ CSRF недействителен. Это все, что вам нужно сделать! Имейте в виду, что эта проверка должна выполняться для любого изменения состояния (в любое время, когда база данных изменяется, путём перехода по URL-адресу).