Помощники вида в Zend Framework

Zend Framework основан на MVC (Model-View-Controller), где вид может получать доступ к модели, ну и выполнять некоторую логику отображения. Да даже не обязательно работа с моделью. Работа с датой, формой или что-то подобное очень удачно решается с использование помощников вида. Конечно, можно прям в файле вида всё это делать, но это загрязняет код, очевидно же.

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

Что такое помощник вида?

Когда я впервые читал про помощник вида, то не понимал, зачем он нужен, если все действия перед отображением в виде можно обработать предварительно в контроллере. Действительно, если контроллер небольшой, то это нормально. Если эти действия применительны только к данному виду, то тоже логично всё в контроллере сделать. Другое дело, если контроллер раздут или для повторного использования в других Views’ах.

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

  • Доступ к моделям.
  • Сложная или повторяемая логика отображения.
  • Преобразование и форматирование данных модели.

Ключевое тут — «обычно«. Я, к примеру, не люблю, когда работа с базой/моделью в различных местах приложения происходит. Данные для отображения в виде подготавливаю в контроллере, в Views просто отображаю. Так что помощник вида использую для форматирования данных или для какой-то повторяемой логики отображения.

Создание и регистрация своего помощника вида

Стоит сразу сказать, что в Zend есть куча стандартных помощников для удобства работы. Лежат они в Zend\View\Helper. Ну, и следовательно имена у них по типу Zend_View_Helper_Doctype. То есть с префиксов ‘Zend_View_Helper_’ все. Если хотите написать свой хелпер, то можно в имени класса использовать этот префикс и закинуть файл в папку со стандартными помощниками.

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

Название класса помощника должно начинаться с большой буквы. Файл с ним должен иметь такое же имя. То есть, если вы хотите создать свой помощник вида ShowLinks, то и файл должен быть ShowLinks.php. В нём обязательно надо определить метод, имя которого такое же, как и название класса, но начинается с буквы нижнего регистра, то есть showLinks.

class Helpers_ShowLinks
{
  public function showLinks()
  {
  ...
  }

}

Так как префикс мы используем не стандартный, то необходимо зарегистрировать наш помощник вида командой addHelperPath(). Я обычно помощники регистрирую в методе init() контроллера. Тогда он будет во всех Action’ах контроллера доступен. Может и в конкретном экшене зарегить, тогда он будет доступен только в нём. Регистрация в контролере будет выглядеть так:

...
$this->view->addHelperPath( Zend_Registry::get('config')->paths->helpers, 'Helpers');  
...

Zend_Registry::get('config')->paths->helpers это путь, который вы в конфиге Zend’а прописали. То есть, команда регистрации ставит в соответствие путь и префикс. Она означает, что все классы с префиксов ‘Helpers_’ необходимо искать в указанной нами папке.

Если мы не наследуем наш помощник от стандартного класса, то необходимо определить метод setView(). Класс в итоге будет таким:

class Helpers_ShowLinks
{
  public $view;
  public function showLinks($params = null)
  {
  ...
  }

  public function setView(Zend_View_Interface $view)
  {
    $this->view = $view;
  }
}

Остаётся только показать, как вызвать помощник в представлении (виде):

<?php echo $this->showLinks(); ?>

То есть, метод помощника вызывается как собственный метод вида. Довольно удобно. Как видите, помощник вида может на входе принимать какие-то параметры, если это необходимо. Помощники хранят состояние. Можно продемонстрировать на примере с framework.zend.com.

class My_View_Helper_SpecialPurpose extends Zend_View_Helper_Abstract
    {
        protected $_count = 0;
        public function specialPurpose()
        {
            $this->_count++;
            $output = "I have seen 'The Jerk' {$this->_count} time(s).";
            return htmlspecialchars($output);
        }
    }

Теперь вызовем в виде повторно метод:

echo $this->specialPurpose();
echo $this->specialPurpose();
echo $this->specialPurpose();

Увидим на экране: I have seen ‘The Jerk’ 1 time(s). I have seen ‘The Jerk’ 2 time(s). I have seen ‘The Jerk’ 3 time(s).