web-dev-qa-db-ja.com

Yii2-リダイレクト後にフラッシュが表示されない

リダイレクトの場合、フラッシュメッセージが壊れているようです。簡単なテストコードを作成しました。

public function actionTest($test = 0) {
    if($test == 0) {
        Yii::$app->getSession()->addFlash('success', 'Follow the white rabbit');
        return Yii::$app->getResponse()->redirect(array('test', 'test' => 1));
    }
    return $this->render('test', []);
}

パラメータなしでアクションを呼び出します。フラッシュが追加され、リダイレクトされます。ページをレンダリングするとき-フラッシュは存在しません。

フラッシュを設定してリダイレクトせずにレンダリングすると、正しくレンダリングされるため、ビュー部分は問題ありません。

どうして?

編集:レイアウトビューコード:

<?php

use frontend\widgets\Alert;

$this->beginPage();
echo $this->render('partials/head');
?>

<body class="no-sidebar">
    <?= $this->beginBody() ?>
    <div id="header">
        <?= $this->render('partials/top') ?>
        <?= $this->render(Yii::$app->user->isGuest ? 'menus/guest' : 'menus/registered') ?>
    </div>
    <!-- Main -->
    <div id="main">
        <?= Alert::widget() ?>
        <?= $content ?>

    </div>

    <?= $this->render('partials/footer') ?>
    <?= $this->endBody() ?>
</body>
</html>

<?php $this->endPage() ?>
11
Joe

コードにreturnがないことがわかるまで、同じエラーが発生しました。したがって、return $this->redirect()を使用すると、正常に機能し、$this->redirect 旨く動きません。

23
user5653303

あなたのコードは大丈夫に見えます、私は問題が何であるかわかりません。使ってみることができます

return $this->redirect(['test', 'test' => 1]);

の代わりに

return Yii::$app->getResponse()->redirect(array('test', 'test' => 1));

これがほとんどのYiiの例です。しかし、コードを見ると問題ないように見えます http://www.yiiframework.com/doc-2.0/yii-web-response.html #redirect()-詳細

セッションが適切に機能していて、どの時点でもセッションを破棄していないことを確認しますか?

これは私のために働きます:

public function actionChangeDetails()
    {
        $model = Contact::findOne(Yii::$app->user->identity->id);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            Yii::$app->session->setFlash('success', 'Form Saved');
            return Yii::$app->getResponse()->redirect(['my-account/change-details']);
        }

        return $this->render('changeDetails', [
            'model' => $model,
        ]);
    }
5
Mihai P.

私には解決策があります:メッセージが表示されるビューファイルに以下の行を追加できます:

次に、メッセージが表示されるはずのビューファイルに以下の行を追加できます。

if(Yii::$app->getResponse()->getStatusCode() != 302) {
   Yii::$app->session->getFlash('error');
}

または、コンテンツレイアウトに以下の行を追加することもできます

<?= Alert::widget() ?>
// Before the line
<?= $content ?>
// in app/views/layouts/_content.php 
// Depending on how you arranged your files.
2
HeadHunter

returnredirectを追加します

Yii::$app->session->getFlash('key', 'message');

return $this->redirect(['yourAction']);
2
leonardo avella

ビューページで、次を追加する必要があります。'session-> getFlash( 'success'); ?> 'ここで説明されているように: Yii2セッション、フラッシュメッセージ 、フラッシュメッセージが表示されます

1
Anaxarchos

私の場合、beforeActionメソッドからリダイレクトしているときに、フラッシュメッセージを利用できませんでした。そして、Yii::$app->end()を使用することは本当に私を助けました。これが私のコードです:

public function beforeAction($action) {
    if ($someVariableIs === false) {
        Yii::$app->session->addFlash("negative", "My flash message");
        Yii::$app->getResponse()->redirect(["/path/to/redirect"]);
        Yii::$app->end();
    }

    // some of your code...

    return true;
}

それが誰かを助けることを願っています。

0
Akmal