Недавно на сайте http://fbdevzone.com/ был рассмотрен удобный способ передачи URL-параметров в действия.
Обычно для этой цели используются методы $this->_getParam() и $this->getRequest()->getParam() в классах контроллера. Это довольно удобный способ, однако он не идеален — прописывать это из метода в метод не очень удобно.
Предложенный способ заключается в том, что параметры передаются в действия в виде аргументов метода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * index/info/
 * index/info/tags/one/tags/two
 * index/info/msg/msg-only
 * index/info/date/2009-10-03
 * index/info/msg/RandomOrder/date/2009-10-03
 *
 * @param array $tags
 * @param Zend_Date $date
 * @param string $msg
 */

public function infoAction(array $tags = null, Zend_Date $date = null, $msg = 'hello')
{
    Zend_Debug::dump($tags);
    if (!is_null($date)) echo $date->get(Zend_Date::DATETIME_FULL);
    else echo "no date passed\n";
    Zend_Debug::dump($msg);
    die;
}

При помощи Zend_Reflection производится парсинг phpdoc-комментариев, присваивая переменным соответствующие типы.
Подробнее читайте в блоге автора. Там же вы найдёте исходный код класса.

6 Comments

  1. lp says:

    если честно, даже из оригинала не совсем понятно, обязателен ли блок phpdoc’a с описанием переменных, или он просто желателен, но можно и без него? вообще странно, учитывая что переменные, да и их типы, указываются в параметрах самого контроллера.

  2. Сергей Митрошин says:

    Не маршруты ведь указываются, а переменные. Не вижу проблемы в том, что это указано в контроллере.

  3. lp says:

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

  4. Сергей Митрошин says:

    Насколько я знаю, он необязателен.
    Служит он, в первую очередь, для приведения типов переменных. Как видно из примера, можно автоматически преобразовывать параметры например в Zend_Date.

  5. albeva says:

    sorry hope you understand english (I can read russian, but not write it) -parameters and type in the phpdoc are optional if you do not require type casting. Since PHP does not allow typed parameters for other than classes and arrays you need to specify them manually.

    // no arguments
    function someAction($mixedType = 0, SomeObject $obj, array $arr) { … }

    However the order in which parameters appear in phpdoc is important! So if you need to specify type hinting for the last argument you need also include all preceding arguments as well -this is due to limitation in Zend_Reflection API

    hope this helps

  6. Сергей Митрошин says:

    albeva, большое спасибо за пояснения.

Leave a Reply