在使用Zend Framework进行preDispatch之前转发到不同的操作/控制器

时间:2011-04-04 14:13:11

标签: model-view-controller zend-framework routing controller dispatcher

我喜欢

<?php
class AccountController extends Zend_Controller_Action
{
    public function init()
    {
        if(!Zend_Auth::getInstance()->hasIdentity()) {
            //need to forward to the auth action in another controller,
            //instead of dispatching to whatever action it would be dispatched to
        }
    }
...

我不能使用$ this-&gt; _forward(“action”),因为auth操作不在同一个控制器中,而在init中,转发必须是在同一个控制器中的操作。有什么想法吗?

$request->setModuleName('module')
            ->setControllerName('controller')
            ->setActionName('action');

也行不通。我试图清除这些参数,但我仍然没有。

2 个答案:

答案 0 :(得分:5)

将其放入Front Controller Plugin

class My_Auth_Plugin extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch($request)
    {
        if(!Zend_Auth::getInstance()->hasIdentity()) {
            $request->setModuleName('module')
            ->setControllerName('controller')
            ->setActionName('action');
        }
    }
}

您可能想要重定向而不是“转发”,您可以使用重定向器帮助程序。

$this->_helper->redirector('action', 'controller', 'module');

请注意,这是重定向器帮助程序的基本用法,您可能还希望使用goToRoute()方法,该方法允许您使用自定义路由。
这是方法的签名:

public function gotoRoute(array $urlOptions = array(), $name = null, 
    $reset = false, $encode = true)

用法类似于视图助手url()

答案 1 :(得分:2)

_forward有多个参数。

$this->_forward($action, $controller, $module, $params)

如果controller为null,则action将在被调用的控制器内。如果module为null,则控制器将在被调用的模块中。

param是一个参数数组。我倾向于通过$this->_request->getParams()