3

Symfony2 アプリケーションで初めてフラッシュ メッセージを設定して表示しようとしています。設定中のフラッシュメッセージは、一度表示するとクリアされません。

コントローラー アクションにフラッシュ メッセージを設定します。

public function startAction()
{
    if (!$this->hasError()) {
        $this->get('session')->setFlash('test_start_error', '');
        return $this->redirect($this->generateUrl('app', array(), true));
    }
}

関連するフラッシュ キーが設定されている場合、対応するビューにエラー通知を表示します。

{% if app.session.hasFlash('test_start_error') %}
    error content here
{% endif %}

正しいエラー条件の下で、コントローラはフラッシュ メッセージを設定し、関連するエラーの内容がビューに表示されます。

表示されると、フラッシュ メッセージは要求ごとに再表示されます。関連するセッション データを を介してvar_dump($this->get('session')->getFlashBag());調べると、フラッシュ コンテンツがセッションに残っていることがわかります。

一度表示されたフラッシュメッセージがセッションから削除されたという印象を受けました。これは私には起こっていません。

明らかに私は何か間違ったことをしています - それは何ですか?

4

1 に答える 1

5
 app.session.hasFlash('test_start_error')

これは実際にはフラッシュ メッセージを破棄しません。次の部分で破棄します。

 {{ app.session.flash('test_start_error') }}

つまり、実際にフラッシュ メッセージを使用する必要があります。存在するかどうかを確認しただけです。

編集: thecatontheflat リクエストに従って、FlashBag (Symfony > 2.0.x) クラスの対応するメソッドを次に示します。

「持っている」方法:

public function has($type)
{
    return array_key_exists($type, $this->flashes) && $this->flashes[$type];
}

実際の get メソッド:

public function get($type, array $default = array())
{
    if (!$this->has($type)) {
        return $default;
    }

    $return = $this->flashes[$type];

    unset($this->flashes[$type]);

    return $return;
}

ご覧のとおり、セッションの設定を解除するのは、実際のフラッシュ メッセージを要求したときだけであり、その存在を確認したときではありません。

Symfony 2.0.x では、フラッシュの動作が異なります。フラッシュは、使用されているかどうかに関係なく、1 つの要求に対して文字通り最後になります。または、コードを参照してローカルでテストした後、少なくともその印象を受けています。

EDIT2:

そうそう、あなたの場合の実際の解決策は、今では明らかでない場合は、次のような if ステートメント内で removeFlash を使用することです。

{% if app.session.hasFlash('test_start_error') %}
    error content here
    {{ app.session.removeFlash('test_start_error') }}
{% endif %}

thecatontheflat に感謝します。与えられた問題の解決策を実際に提供していないことを指摘してくれました。:)

PS removeFlash メソッドは v2.1 で廃止され、v2.3 から削除されます。とにかく、Session クラスの内部を見ると、FlashBag クラスから get メソッドを呼び出す仲介者のように動作するだけで、そのメソッドが実際に削除を行っていることがわかります。

于 2012-08-18T15:22:47.223 に答える