27

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

我的用户控制器代码

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!

任何帮助表示赞赏。

4

8 回答 8

62

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

  return $this->redirect(['user/index']);
于 2014-05-28T14:38:55.503 回答
33

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

 return $this->redirect('/some/url',302)->send();
于 2016-07-22T06:35:25.707 回答
10

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

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

如果要立即发送 Header 信息,请使用send()。此方法将Location标头添加到当前响应。

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

如果您想要完整的 URL,则将 likeUrl::to(['user/index', 'id' => 302])与 . 的标头一起使用use yii\helpers\Url;

欲了解更多信息,请查看此处。希望这会对某人有所帮助。

于 2017-05-04T04:24:17.237 回答
8

我一直在为重定向不工作而苦苦挣扎,上面提到的都没有对我有用,直到我尝试了这个:

改变:

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

至:

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

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

于 2016-10-26T12:29:46.560 回答
4

将浏览器重定向到指定的 URL。

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

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

在其他地方,如果要立即发送“Location”标头,则应使用以下代码:

Yii::$app->getResponse()->redirect($url)->send();
return;
于 2016-09-26T07:54:03.147 回答
3

这是另一种方法

if(!Yii::$app->request->getIsPost()) {
    return Yii::$app->getResponse()->redirect(array('/user/index',302));
}
于 2015-07-15T07:58:54.827 回答
2

试试这个

if(!Yii::$app->request->getIsPost()) 
{
  Yii::$app->response->redirect(array('user/index','id'=>302));
    exit(0);
}
于 2014-05-27T15:45:25.210 回答
2

在最好的情况下,不要使用exit(0);That's bad practice。利用Yii::$app->end();

所以你的代码看起来像

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

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

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
            ],
        ],
    ];
}
于 2017-04-02T15:50:25.680 回答