Skip to content

Latest commit

 

History

History
84 lines (61 loc) · 7.2 KB

Controllers.md

File metadata and controls

84 lines (61 loc) · 7.2 KB

Контроллеры. SimpleMVC

Как уже было сказано ранее, SMCV реализует концепцию MVC.

Что это означает на практике? Обычно то, что запрос пользователя (каким бы он ни был) всегда обрабатывается действием какого-то контроллера -- т.е. вызывается код, написанный в контроллере и уже код этого контроллера "решает", что делать дальше.

При этом, опять же, на практике в SMVC справедливы следующие утверждения:

  • Контроллер - это класс, унаследованный от родительского класса контроллера \ItForFree\SimpleMVC\MVC\Controller из Ядра (см. раздел о разделении универсальной и частной логики в SMVC).
  • Действие контроллера (action, "экшн") -- метод класса контроллера, отвечающий за какую-то конкретную задачу. Например, за получение списка статей (из СУБД или как-то ещё), или за вывод формы редактирования пользователя и обработку запроса, приходящего в результате отправки этой формы пользователем.

Когда выполняется код контроллера

Код контроллера выполняется Ядром системы, когда она "понимает", что запрос пользователя соответствует маршруту, за который отвечает данный контроллер.

Подробнее об этом и том как сделать, чтобы контролллер выполнился, читайте в разделе "Маршрутизация".

Базовый класс контроллера \ItForFree\SimpleMVC\MVC\Controller

Базовый класс контроллера (см. исходный код), определяет следующие основные свойства:

  • свойство $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 задает конкретное имя макета (или путь к нему), который нужно использовать для представлений данного контроллера (см. подробности в разделе "Макеты представлений").

Что ещё почитать по контроллерам