【问题标题】:Forward to a different action/controller before preDispatch with Zend Framework在使用 Zend 框架进行 preDispatch 之前转发到不同的动作/控制器
【发布时间】:2011-07-29 05:24:32
【问题描述】:

我有类似的东西

<?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->_forward("action") 因为身份验证操作不在同一个控制器中,并且在 init 中,转发必须针对同一个控制器中的操作。有什么想法吗?

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

也不行。我已尝试清除参数,但仍然一无所获。

【问题讨论】:

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


    【解决方案1】:

    把它放在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()

    【讨论】:

    • 请记住,Zend 框架是一个模块化系统。此重定向器仅在您使用默认路由(我不是)时才有效。我正在重定向,但我不能只是重定向,因为我还在做其他事情(这就是为什么我有另一个动作)。也就是说,你的方法奏效了。但顺便说一下,它是 Zend_Controller_plugin_Abstract,而不是 Zend_Front_Controller_Plugin_Abstract。
    • 是的,对不起,我编辑了我的答案以纠正错字。我还添加了关于重定向器的评论。
    【解决方案2】:

    _forward 有多个参数。

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

    如果控制器为空,那么动作将在被调用的控制器内。如果模块为空,则控制器将在被调用模块内。

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

    【讨论】:

    • 如我所说,在这种情况下,我不能在 init() 中使用 $this->_forward()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多