Yii中的AfterAction缺陷

时间:2014-11-13 12:05:11

标签: php redirect yii

当我在动作中使用重定向时,afterAction方法(在controller.php中)不起作用!! 我该如何解决这个问题?

注意:我不能使用beforeAction,因为我在我的动作中生成一个变量,我在afterAction中使用它 提前谢谢......

    public function actionHsh()
    {
        $this->hesam= 502;
        $this->redirect(array('charge/printMyCharge'));
    }

在CController中

    protected function afterAction($action)
    { 
       $number = $this->hesam= 502;

    }

2 个答案:

答案 0 :(得分:4)

让我们从" 开始,为什么它不起作用?"。因为CController::redirect()的定义如下:

public function redirect($url,$terminate=true,$statusCode=302)
{
    if(is_array($url))
    {
        $route=isset($url[0]) ? $url[0] : '';
        $url=$this->createUrl($route,array_splice($url,1));
    }
    Yii::app()->getRequest()->redirect($url,$terminate,$statusCode);
}

CHttpRequest::redirect()的定义如下:

public function redirect($url,$terminate=true,$statusCode=302)
{
    if(strpos($url,'/')===0 && strpos($url,'//')!==0)
        $url=$this->getHostInfo().$url;
    header('Location: '.$url, true, $statusCode);
    if($terminate)
        Yii::app()->end(); // Notice this? We only stop when $terminate is true
}

基本上你可以做两件事。

1)使用redirect($url, false)来避免终止

2)扩展控制器中的redirect方法:

class Foo extends CController 
{
    public function redirect($url,$terminate=true,$statusCode=302)
    {
        if (method_exists($this, 'afterAction')) {
            $this->afterAction(null);
        }

        parent::redirect($url,$terminate,$statusCode);
    }
}

答案 1 :(得分:1)

在重定向之前使用afteraction 享受它!