Содержание


Плагины контроллера


Controller Plugins, MVC, ЗФ2, Zend Framework 2, ZF2, ру, ru




При использовании AbstractActionController, AbstractRestfulController, или при реализации метода setPluginManager в Вашем контроллере, появляется возможность доступа к списку предустановленных плагинов.  Или зарегистрировать свой собственный плагин.

 

Предустановленные плагины из коробки:

 

Zend\Mvc\Controller\Plugin\FlashMessenger

Zend\Mvc\Controller\Plugin\Forward

Zend\Mvc\Controller\Plugin\Layout

Zend\Mvc\Controller\Plugin\Params

Zend\Mvc\Controller\Plugin\PostRedirectGet

Zend\Mvc\Controller\Plugin\Redirect

Zend\Mvc\Controller\Plugin\Url

 

При реализации методов setPluginManager, getPluginManager и методов плагина, можно получить доступ к описанным плагинам, используя метод «plugin()»:

$plugin = $this->plugin('url');

Так же в AbstractActionControllerи AbstractRestfulController есть возможность использовать реализацию метода «__call()»  для вызова плагинов:

$plugin = $this->url();

FlashMessenger

 

Плагин FlashMessenger используется для  создания и получения само-устаревающих сообщениях сессий. Он предоставляет ряд методов:

 

  • setSessionManager() - позволяет указать альтернативный менеджер сессии, если это необходимо.
  • getSessionManager() – позволяет получить зарегистрированный session manager
  • getContainer() – возвращает объект Zend\Session\Container, в котором хранятся флэш - сообщения.
  • setNamespace() – позволяет указать определенное пространство имен в контейнере, где хранятся флэш – сообщения.
  • getNamespace() – получить имя пространства имен, где хранятся флэш – сообщения.
  • addMessage() – позволяет добавлять сообщения в текущее пространство имен контейнера сессий.
  • hasMessages() – позволяет определить, существуют ли флэш-сообщения в заданном пространстве имен контейнера сессий.
  • getMessages() - позволяет извлекать сообщения из текущего пространство имен контейнера сессий.
  • clearMessages() - позволяет очистить сообщения из текущего пространство имен контейнера сессий.
  • hasCurrentMessages() – указывает, были ли добавлены сообщение в течении выполнения текущего запроса.
  • getCurrentMessages() - возвращает все сообщения, добавленные во время текущего запроса.
  • clearCurrentMessages() - удаляет все сообщения, добавленные во время текущего запроса.

 

Также FlashMessenger реализует Итератор и счетчик. Позволяя использовать count() и foreach().

 

Пример:

public function processAction()
{
    // ... do some work ...
    $this->flashMessenger()->addMessage('You are now logged in.');
    return $this->redirect()->toRoute('user-success');
}
 
public function successAction()
{
    $return = array('success' => true);
    $flashMessenger = $this->flashMessenger();
    if ($flashMessenger->hasMessages()) {
        $return['messages'] = $flashMessenger->getMessages();
    }
    return $return;
}


Плагин Forward

 

Возможно, будет необходимость вызвать другой контроллер из контроллера-соответствия (на который направлен запрос). Например: например построить виджеты. Данный плаин поможет Вам в этом.

 

Для работы с плагином Forward, контроллер вызывающий его должен быть ServiceLocatorAware. Иначе плагин не сможет получить настройки и инъецировать экземпляр запрошенного контроллера.

 

В данном плагине имеется всего один метод «dispatch()», который принимает два аргумента.

- $name – имя вызываемого контроллера. Может быть полным именем класса, либо псевдоним (alias) , определенный в  ServiceManager. 

- $params – не обязательный массив параметров. Используется в объекте RouteMatch для определения целей конкретного запроса.

 

Forward  возвращает результат работы запрашиваемого контроллера, а разработчику необходимо уже самому определиться, что делать с этими данными. Как совет: объединить их все в возвращаемое значение в вызываемом контроллере.

 

Пример:

$foo = $this->forward()->dispatch('foo', array('action' => 'process'));
return array(
    'somekey' => $somevalue,
    'foo'     => $foo,
);


Плагин Layout

 

Позволяет изменять шаблоны внутри действий контроллера. Для этого используется единственный метод «setTemplate()», который принимает единственный аргумент:

- $template  - имя необходимого шаблона.

 

Пример:

$this->layout()->setTemplate('layout/newlayout');

Так же реализуется магический метод «__invoke», который позволяет устанавливать шаблоны еще проще:

$this->layout('layout/newlayout');


Плагин Params

 

Позволяет осуществлять доступ к настройкам в действиях с различных источников.

Определенно по одному методу на каждый тип источника:

- fromFiles($name=null,$default=null)

Получение всех или только одного файла. Если «$name» указана как «NULL»,  будут возвращены все файлы.

- fromHeader($header=null,$default=null)

Для получения всех или только одного параметра из header (заголовка). Если $header NULL, то вернутся все параметры.

- fromPost($param=null,$default=null)

Для получения всех или только одного параметра из POST . Если $ param NULL, то вернутся все параметры.

- fromQuery($param=null,$default=null)

Для получения всех или только одного параметра из GET . Если $ param NULL, то вернутся все параметры.

- fromRoute($param=null,$default=null)

Для получения всех или только одного параметра из Route. Если $ param NULL, то вернутся все параметры. 

 

Так же реализуется магический метод «__invoke», который позволяет создавать короткое замыкание в методе fromRoute():

$this->params()->fromRoute('param', $default);
// or
$this->params('param', $default);


Плагин Post/Redirect/Get

 

При отправке запроса POST (или отправки формы), браузер пытается защитить пользователя от отправки POST данных повторно: отключая кнопку «Назад», выводом всплывающих окон и предупреждений, а иногда и перегистрируя форму. Однако, вместо всего этого необходимо просто сохранять данные POST в контейнере сессии и перенаправлять пользователя на нужную страницу GET запросом.

 

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

- $redirect – строка, содержащая нужное имя маршрута или URL,  основанный на содержимом второго параметра.

- $redirectToUrl – булевое значение. Если установлено в «TRUE»  -  то первый параметр будет рассматриваться как URL. Иначе -  как имя маршрута (route).  По умолчанию - «FALSE». Если же аргументы отсутствуют -  используется текущий маршрут.

// Pass in the route/url you want to redirect to after the POST
$prg = $this->prg('/user/register', true);
 
if ($prg instanceof Zend\Http\PhpEnvironment\Response) {
    // returned a response to redirect us
    return $prg;
} elseif ($prg === false) {
    // this wasn't a POST request, but there were no params in the flash messenger
    // probably this is the first time the form was loaded
    return array('form' => $myForm);
}
 
// $prg is an array containing the POST params from the previous request
$form->setData($prg);
 
// ... your form processing code here


Плагин Redirect

 

Перенаправление довольно обычная задача. Однако, если делать это вручную, то необходимо будет выполнить следующее:

- Сформировать URL  с помощью маршрутизатора.

- Создать и внедрить заголовок «Location» в объект ответа, указывая на сформированный URL.

- Установить статус код ответа в «3ХХ»

 

Плагин Redirect делает все, что было описано выше сам, используя всего два метода:

- toRoute($route, array $params = array(), array $options = array()).

Перенаправляет  на указанный маршрут, используя  $params и $options  для формирования URL.

- toUrl($url)

Просто перенаправляет на указанный URL.

 

В любом из методов возвращается объект ответа (Response). Если Вы сразу же его вернете, то можно эффективно использовать короткое замыкание ответа.

 

Важно: Для этого плагина важно, что б контроллер реализовал InjectApplicationEvent, а настроенный MvcEvent извлекал маршрутизатор из объекта события.

 

 Пример:

return $this->redirect()->toRoute('login-success');

Плагин Url

 

Иногда возникает необходимость  создавать URL из определения маршрутов в Вашем контроллере – упорядочить вызов шаблонов, создавать заголовки и т.д. Объект MvcEvent делает это автоматически. А если б Вы делали это вручную, то выглядело б так:

$router = $this->getEvent()->getRouter();
$url    = $router->assemble($params, array('name' => 'route-name'));
Помощник Url немного упрощает этот процесс:
$url = $this->url()->fromRoute('route-name', $params);

Метод «fromRoute()» является единственным и имеет следующий синтаксис:

public function fromRoute($route, array $params = array(), array $options = array())

Важно: Для этого плагина важно, что б контроллер реализовал InjectApplicationEvent, а настроенный MvcEvent извлекал маршрутизатор из объекта события.


Автор статьи: DuB