web-dev-qa-db-ja.com

コントローラアクションでの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!_の呼び出し

任意の助けに感謝します。

21
Andreas

Yii2では、アクションの結果をreturn()する必要があります。リダイレクトの前にreturnを追加する必要があると思います。

  return $this->redirect(['user/index']);
50
Dency G B

beforeAction()でリダイレクトを実行しようとしている場合は、send()メソッドを使用する必要があります

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

私はこれを試すまで、リダイレクトが非常に長く機能しないことに苦労しました。

変化する:

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

に:

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

つまり、[]括弧で囲む必要があります。私はPHP 7を使用しています。

7
Perry J

この方法でもリダイレクトできます:

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

ヘッダー情報をすぐに送信する場合は、send()を使用します。このメソッドはLocation現在の応答のヘッダー。

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

完全なURLが必要な場合は、_use yii\helpers\Url;_のヘッダーでUrl::to(['user/index', 'id' => 302])のように使用します。

詳細については、 ここ を確認してください。これが誰かを助けることを願っています。

3
lalithkumar

これを行う別の方法があります

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

ブラウザを指定されたURLにリダイレクトします。

このメソッドは、「Location」ヘッダーを現在の応答に追加します。 send()が呼び出されるまでヘッダーを送信しないことに注意してください。コントローラアクションでは、このメソッドを次のように使用できます。

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

他の場所で、「Location」ヘッダーをすぐに送信する場合は、次のコードを使用する必要があります。

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

exit(0);は使用しないでください。 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
            ],
        ],
    ];
}
1
Coz

これで試してみてください

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