Использование помощников действий

Вчера Роб Ален опубликовал в своем блоге Akra’s DevNotes заметку про написание помощников действий в Zend Framework-е. Заметка хоть и не большая, но для новичков будет полезной. Представляю перевод этой заметки.

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

Первое, что вы должны сделать — решить где разместить их. Последняя версия рекомендаций по стандартной структуре проекта предлагает использовать подкаталоги вашего каталога контроллеров. Т.е. <strong>application/controllers/helpers/</strong>, и это лучший вариант.

Во-первых, вы должны сказать брукеру помощников где располагаются ваши помощники действий. Я обычно делаю это в загрузчике (bootstrap file), но точно так же можно сделать это и в плагине фронт-контроллера.

Zend_Controller_Action_HelperBroker::addPath(
        APPLICATION_PATH .'/controllers/helpers');

Затем вы должны создать помощник действий, мы назовем его Multiples в нашем примере, тогда название файла будет <strong>application/controllers/helpers/Multiples.php</strong>:

<?php
class Zend_Controller_Action_Helper_Multiples extends
                Zend_Controller_Action_Helper_Abstract
{
    function direct($a)
    {
        return $a * 2;
    }
}

Обратите внимание на префикс названия класса помощника действий — <strong>Zend_Controller_Action_Helper</strong>. Вы можете поменять этот префикс на другой, передав его вторым параметром в функции <strong>Zend_Controller_Action_HelperBroker::addPath()</strong>, вызвав её в вашем загрузчике.

Наконец, использование в действии контроллера:

<?php

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $this->view->headTitle('Home');
        $this->view->title = 'Test of the Multiples action helper';

        $number = 30;
        $twice = $this->_helper->multiples($number);
        $this->view->number = $number;
        $this->view-twice = $twice;
    }
}

Обратите внимание на то, что мы вызываем помощник действия как метод класса _helper. Этот вызов транслируется в вызов метода direct () нашего класса помощника.

Также вы можете написать несколько методов в одном помощнике действий:

class Zend_Controller_Action_Helper_Multiples extends
                Zend_Controller_Action_Helper_Abstract
{
    function direct($a)
    {
        return $a * 2;
    }
    function thrice($a)
    {
        return $a * 3;
    }
}

Для вызова метода thrice () в действии вашего контроллера делайте так:

$thrice = $this->_helper->multiples->thrice($number);

Таким образом, если вы используете имя помощника действий как свойство _helper, то вы можете вызвать любой метод из этого помощника.

Это всего лишь общие сведения для начала освоения. За подробностями обращайтесь к руководству.

Удачи и избегайте копи-паста общей функциональности!

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
Print
1 звезда2 звезды3 звезды4 звезды5 звезд (1 голосов, средний: 5.00 из 5)
Loading ... Loading ...

Метки: , ,



7 комментариев на “Использование помощников действий”

  1. Олег, хотел с вами недавно связаться, не нашел на блоге ни одного контакта :)

  2. Лобач Олег пишет:

    Мне можно писать на oleg [at] lobach.info

  3. [...] Лобач.info Заметки LAMP-программиста о вебдеве и не только… « Использование помощников действий [...]

  4. Лобач Олег пишет:

    Олег, хотел с вами недавно связаться

    А по какому поводу, можно узнать?

    Я, кстати, тоже писал Вам по поводу каталога, но ответа не было.

  5. Олег, написал вам.

  6. Topik пишет:

    Привет Олег.

    У меня к Вам такой вопрос как можно пропарсить строку вида '$this->siteUrl' в переменную — ну например есть html в базе, но его нужно вевести с учетом текущего скина на страницу.

  7. Лобач Олег пишет:

    Topik, что-то я не совсем понимаю задачу. Опиши подробнее, если еще актуально.

Оставить комментарий