控制器动作中的yii2重定向不起作用?

时间:2014-05-27 15:36:35

标签: redirect yii2

我将表单发布到/ user / save以保存用户数据。如果$ _SERVER [' REQUEST_METHOD']不是' post'当我尝试重定向用户时会出现问题。

我的用户控制器代码

namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\MyUser;

class UserController extends Controller {

public function actionSave() {

    if(!Yii::$app->request->getIsPost()) {
       $this->redirect('/user/index',302);
       exit(0);
   }

   //do something to save user submitted data       
}

}//~CLASS

无法让重定向工作。虽然!Yii::$app->request->getIsPost() is false呼叫$this->redirect does nothing!

任何帮助表示感谢。

8 个答案:

答案 0 :(得分:47)

在Yii2中,我们需要return()操作的结果。我认为您需要在重定向前添加return

  return $this->redirect(['user/index']);

答案 1 :(得分:23)

如果您尝试在 beforeAction()中进行重定向,则应使用 send()方法

 return $this->redirect('/some/url',302)->send();

答案 2 :(得分:7)

我挣扎着重定向不能长时间工作, 上面提到的都不适用于我,直到我尝试了这个:

更改:

return $this->redirect('site/secure');

为:

return $this->redirect(['site/secure']);

换句话说,需要将它括在[]括号内! 我使用PHP 7,可能是为什么?

答案 3 :(得分:3)

您也可以通过此方法重定向:

return Yii::$app->response->redirect(['user/index', 'id' => 10]);

如果您想立即发送标题信息,请使用发送()。此方法会在当前响应中添加位置标题。

return Yii::$app->response->redirect(['user/index', 'id' => 10])->send();

如果您需要完整的网址,请使用Url::to(['user/index', 'id' => 302])标题use yii\helpers\Url;

有关详情,请查看Here。 希望这会对某人有所帮助。

答案 4 :(得分:2)

这是另一种方法

if(!Yii::$app->request->getIsPost()) {
    return Yii::$app->getResponse()->redirect(array('/user/index',302));
}

答案 5 :(得分:1)

尝试

if(!Yii::$app->request->getIsPost()) 
{
  Yii::$app->response->redirect(array('user/index','id'=>302));
    exit(0);
}

答案 6 :(得分:1)

将浏览器重定向到指定的网址。

此方法为当前响应添加“Location”标头。请注意,在调用send()之前,它不会发送标头。在控制器操作中,您可以按如下方式使用此方法:

return Yii::$app->getResponse()->redirect($url);

在其他地方,如果您想立即发送“位置”标题,则应使用以下代码:

Yii::$app->getResponse()->redirect($url)->send();
return;

答案 7 :(得分:1)

不要使用exit(0);这在最好的时候是不好的做法。使用Yii::$app->end();

所以你的代码看起来像

$this->redirect(['index'], 302);
Yii::$app->end();

虽然说实际问题是停止POST请求,但这是解决该问题的错误方法(尽管它确实有效)。要停止POST请求,您需要使用access control

public function behaviors()
{
    return [
        'access' => [
            'class' => \yii\filters\AccessControl::className(),
            'only' => ['create', 'update'],
            'rules' => [
                // deny all POST requests
                [
                    'allow' => false,
                    'verbs' => ['POST']
                ],
                // allow authenticated users
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
                // everything else is denied
            ],
        ],
    ];
}