При использовании 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 реализует Итератор и счетчик. Позволяя использовать 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, контроллер вызывающий его должен быть ServiceLocatorAware. Иначе плагин не сможет получить настройки и инъецировать экземпляр запрошенного контроллера.
В данном плагине имеется всего один метод «dispatch()», который принимает два аргумента.
- $name – имя вызываемого контроллера. Может быть полным именем класса, либо псевдоним (alias) , определенный в ServiceManager.
- $params – не обязательный массив параметров. Используется в объекте RouteMatch для определения целей конкретного запроса.
Forward возвращает результат работы запрашиваемого контроллера, а разработчику необходимо уже самому определиться, что делать с этими данными. Как совет: объединить их все в возвращаемое значение в вызываемом контроллере.
Пример:
$foo = $this->forward()->dispatch('foo', array('action' => 'process')); return array( 'somekey' => $somevalue, 'foo' => $foo, );
Позволяет изменять шаблоны внутри действий контроллера. Для этого используется единственный метод «setTemplate()», который принимает единственный аргумент:
- $template - имя необходимого шаблона.
Пример:
$this->layout()->setTemplate('layout/newlayout');
Так же реализуется магический метод «__invoke», который позволяет устанавливать шаблоны еще проще:
$this->layout('layout/newlayout');
Позволяет осуществлять доступ к настройкам в действиях с различных источников.
Определенно по одному методу на каждый тип источника:
- 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 (или отправки формы), браузер пытается защитить пользователя от отправки 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
Перенаправление довольно обычная задача. Однако, если делать это вручную, то необходимо будет выполнить следующее:
- Сформировать 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 из определения маршрутов в Вашем контроллере – упорядочить вызов шаблонов, создавать заголовки и т.д. Объект 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 извлекал маршрутизатор из объекта события.