Экшены и контроллеры

Содержание...

Создание классов экшенов.

Файлы классов экшенов размещаются в файловой структуре приложения в каталоге wa-apps/{APP_ID}/lib/actions/. Для каждого модуля рекомендуется создавать отдельный подкаталог и размещать файлы по следующей схеме: wa-apps/{APP_ID}/lib/actions/{MODULE}/{имяФайла}.php.

Экшены можно разделить на два типа по способу группировки логики действий в классы:

  • множественные
  • одиночные

Множественные экшены

Если страницы, генерируемые экшенами, похожи между собой и несложны по структуре, то удобно такие экшены реализовывать в одном файле. Такая организация экшенов встречается во многих фреймворках, в частности в Zend Framework.

Для этого вида организации существует базовый класс waViewActions. В коде приложения класс множественного экшена нужно наследовать от этого базового класса. Названия методов, реализующих экшены, должны заканчиваться суффиксом Action.

Пример кода класса множественного экшена:

<?php
class guestbookBackendActions extends waViewActions
{
    // Действие по умолчанию
    public function defaultAction()
    {
        ...
    }
    // Действие delete
    public function deleteAction()
    {
        ...
    }
}

Одиночные экшены

Если логика отдельной страницы сложна и требует внутреннего разделения на несколько частей, то лучше вынести такой экшен в отдельный класс. Это позволит избежать образования классов типа waViewActions очень большого размера.

Классы одиночных экшенов наследуются от системного класса waViewAction. Метод, реализующий действие, должен называться execute.

Пример кода класса одиночного экшена:

<?php
class myappOrderShowAction extends waViewAction
{
  public function execute()
  {
      ...
  }
}

Реализация логики экшена

В большинстве случаев задача экшена в упрощенном варианте сводится к следующей схеме: получить данные от модели и передать их в шаблонизатор для отображения в браузере пользователя .

Передача данных в шаблонизатор

В процессе формирования кода страницы шаблонизатор использует данные, полученные от экшена. Данные для отображения на странице передаются в шаблон в коде экшена с помощью следующей конструкции:

$this->view->assign('var', $var);

Пример кода экшена, иллюстрирующий передачу в шаблон данных, полученных от модели:

<?php
class guestbookFrontendAction extends waViewAction
{
    public function execute()
    {
        // Создаем экземпляр модели для получения данных из БД
        $model = new guestbookModel();
        // Получаем записи гостевой книги из БД
        $records = $model->order('datetime DESC')->fetchAll();
        // Передаем записи в шаблон
        $this->view->assign('records', $records);
    }
}

Создание классов контроллеров

В ряде случаев логики, встроенной в контроллер по умолчанию, недостаточно. Например, когда шаблон (а значит и выполняемый набор экшенов) формируемой страницы зависит от ряда условий или когда результатом запроса не является генерация HTML-кода (например, выполняется перенаправление пользователя на другой URL). В таких случаях требуется создание класса специализированного контроллера.

Для создания контроллеров существует два базовых класса: waController и waViewController.

Если логика обработки запроса не предусматривает формирование веб-страницы, то соответствующий класс контроллера необходимо наследовать от базового класса waController; в противном случае класс контроллера наследуется от waViewController. Метод, реализующий обработку запроса должен называться execute.

Реализация логики контроллера

Наиболее распространенная схема работы контроллера без генерации страницы: после выполнения необходимых операций перенаправить браузер пользователя на другой URL. Такая схема часто используется, когда выполняется запрос на внесение изменений в данные (удаление или создание новой либо сохранение отредактированных данных). В этом случае браузер отправляет на сервер POST-запрос, сервер обрабатывает полученные данные и затем перенаправляет пользователя на страницу, позволяющую увидеть только что сохраненные данные.

Перенаправление на другой адрес

Перенаправление браузера на новый URL выполняется в коде контроллера с помощью следующей конструкции:

$this->redirect('some_url');

Пример кода класса контроллера с использованием перенаправления:

<?php
class someappRecordSaveController extends waController
{
    public function execute()
    {
        ...
        $this->redirect('some_url');
    }
}

Вызов экшенов

Вызов экшена в коде контроллера производится с помощью конструкции вида

$this->executeAction($action);

Пример контроллера с формированием кода новой страницы:

<?php
class someappRecordDoController extends waViewController
{
    public function execute()
    {
        if (waRequest::getMethod() == 'post') {
            $this->executeAction(new someappRecordPostAction());
        } else {
            $this->executeAction(new someappRecordGetAction());
        }
    }
}