Zend_Controller_Action_Helper_Url和Zend_View_Helper_Url有什么区别?

时间:2013-03-14 01:17:24

标签: php zend-framework routing controller helper

我目前正在使用ZF 1.12.2,并且我正在使用URL操作助手在我的表单上设置操作属性,但是操作助手正在执行数组到字符串的转换。我评论了下面我要回复的内容:

<?php
// application/modules/user/controllers/SignupController.php

class User_SignupController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $form = new User_Form_Signup();

        // This gives me 'user/signup/Array'
        $signup_url = $this->_helper->url(array(
            'module' => 'user',
            'controller' => 'signup',
            'action' => 'register'
        ));

        // This gives me 'user/signup/register', which is what I want
        $signup_view_url = $this->view->url(array(
            'module' => 'user',
            'controller' => 'signup',
            'action' => 'register'
        ));

        $form->setAction(...);
    }

    public function registerAction()
    {

    }
}

我真的不明白为什么会这样。我检查了Zend_Controller_Action_Helper_Url和Zend_View_Helper_Url,它们的方法类似:

// get the front controller's router
$router = Zend_Controller_Front::getInstance()->getRouter(); 

// assemble the route
return $router->assemble($urlOptions, $name, $reset, $encode);

我刚刚发现Zend_Controller_Action_Helper_Url::simple可以解决我的需求的中间问题,但我仍然对上面的归档感到困惑和好奇。

路由器如何使用相同的参数对同一对象的方法上的两个单独调用组合两个完全不同的路由(一个完全错误)?我还没有在bootstrap中添加任何路由,也没有在我的配置中添加任何路由。

1 个答案:

答案 0 :(得分:3)

调用$this->_helper->url实际上会返回该类。使用参数以这种方式调用操作助手时,参数将传递给该助手上的direct()方法。在这种情况下,direct()方法最多需要三个参数,第一个参数应该是操作名称。所以你遇到问题的原因是帮助者期望提供一个动作名称,但是你提供的是一个数组。

您真正想要的是在帮助程序上调用url()方法:

$this->_helper->url->url(array(
    'module' => 'user',
    'controller' => 'signup',
    'action' => 'register'
));

我个人通常使用'other'语法在控制器中调用动作助手:

$this->getHelper('url')->url(array(
    'module' => 'user',
    'controller' => 'signup',
    'action' => 'register'
));

我觉得有点清楚。