Как уже было сказано ранее, SMCV реализует концепцию MVC.
Что это означает на практике? Обычно то, что запрос пользователя (каким бы он ни был) всегда обрабатывается действием какого-то контроллера -- т.е. вызывается код, написанный в контроллере и уже код этого контроллера "решает", что делать дальше.
При этом, опять же, на практике в SMVC справедливы следующие утверждения:
- Контроллер - это класс, унаследованный от родительского класса контроллера
\ItForFree\SimpleMVC\MVC\Controller
из Ядра (см. раздел о разделении универсальной и частной логики в SMVC). - Действие контроллера (action, "экшн") -- метод класса контроллера, отвечающий за какую-то конкретную задачу. Например, за получение списка статей (из СУБД или как-то ещё), или за вывод формы редактирования пользователя и обработку запроса, приходящего в результате отправки этой формы пользователем.
Код контроллера выполняется Ядром системы, когда она "понимает", что запрос пользователя соответствует маршруту, за который отвечает данный контроллер.
Подробнее об этом и том как сделать, чтобы контролллер выполнился, читайте в разделе "Маршрутизация".
Базовый класс контроллера (см. исходный код), определяет следующие основные свойства:
- свойство
$view
-- тут хранится экземпляр классаItForFree\SimpleMVC\MVC\View
, который позволяет работать с представлениями (подробнее см. раздел Представления), это свойство устанавливается прямо в конструкторе базового класса контроллера:
public function __construct() {
$this->view = new View($this->layoutPath);
}
- свойство
$layoutPath
-- тут хранится путь к макету данного контроллера. Кратко уточним, что именно это свойство задает путь к коду, который определяется общие части верстки страниц (см. подробности в разделе "Макеты представлений").
-- по сути это два самых главных атрибута базового класса контроллера, именно они позволяют пользовательским контроллерам, работать с Представлениями, передавая туда переменные и в принципе вызывая отображения Представлений (подробности см. в разделе "Представления").
Также в базовом классе контроллера имеется метод редиректа:
public function redirect($path) { // 302 редирект
header("Location: $path");
}
}
-- это метод не играет какой-то существенной роли в архитектуре, но вынесен в родительский класс для удобства, чтобы его можно было просто унаследовать контроллерах потомках и использовать, в случае необходимости.
В качестве примера возьмем класс контроллера домашней страницы HomepageController
(исх. код)):
<?php
namespace application\controllers;
/**
* Контроллер для домашней страницы
*/
class HomepageController extends \ItForFree\SimpleMVC\MVC\Controller
{
/**
* @var string Название страницы
*/
public $homepageTitle = "Домашняя страница";
/**
* @var string Пусть к файлу макета
*/
public $layoutPath = 'main.php';
/**
* Выводит на экран страницу "Домашняя страница"
*/
public function indexAction()
{
$this->view->addVar('homepageTitle', $this->homepageTitle); // передаём переменную по view
$this->view->render('homepage/index.php');
}
}
-- у этого контроллера:
- есть единственное действие
indexAction()
, в коде выше оно отвечает за вывод домашней страницы (при этом вообще у контроллера действий может быть много, один контроллер группирует действия связанные какой-то общей темой или назначением в системе). - свойство класса
$homepageTitle
служит просто для удобного хранения данных (т.е. это свойство можно назвать пользовательским, наследуя базовый класс котроллера, вы можете также добавлять свои новые свойства, если требуются, но учитывайте, что у контроллера есть и специальные свойста, на которые опирается Ядро системы). - свойство
$layoutPath
задает конкретное имя макета (или путь к нему), который нужно использовать для представлений данного контроллера (см. подробности в разделе "Макеты представлений").
- Проектирование контроллеров (сколько, как много их нужно создавать): http://fkn.ktu10.com/?q=node/10717