9

次のコードを使用して、コントローラーにフラッシュメッセージを設定しました。

$this->get('session')->getFlashBag()->add('success', 'Message sent successfully');

そして私のテンプレートでは、それを表示する(しようとする)ために以下を使用します:

{% if app.session.flashbag.has('success') %}
    <div id="flash">
        {{ app.session.flashbag.get('success') }}
    </div>
{% endif %}

get問題は、文字列を返すと記載されているAPIドキュメントにもかかわらず、配列から文字列への変換例外が発生することです。テンプレートのコードを次のように変更した場合:

{% for flashMessage in app.session.flashbag.get('success') %}
    <div id="flash">
        {{ flashMessage }}
    </div>
{% endfor %}

それは完璧に動作します。メッセージが1つだけになるかどうかはわからないので、ここではループを使用しません。

単一のフラッシュメッセージの存在を確認し、存在する場合はそれを表示できる解決策はありますか?それとも私は役に立たないループで立ち往生していますか?

4

4 に答える 4

11

0でインデックスを付けることによってそれを解決しました:

{{ app.session.flashbag.get('success')[0] }}

私の疑惑は正しかった-get文字列ではなく配列を返す。フラッシュバッグのadd方法は次のとおりです。

public function add($type, $message)
{
    $this->flashes[$type][] = $message;
}

そしてget

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

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

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

    return $return;
}

現実を反映するように、APIドキュメントを修正する必要があります。また、単一のフラッシュメッセージを処理するためのエレガントな方法を提供する必要があります。

編集:下位互換性のある(PHP 5.3以下)バージョン-

{% if app.session.flashbag.has('success') %}
    {% set flashbag = app.session.flashbag.get('success') %}
    {% set message = flashbag[0] %}
    <div id="flash">
        {{ message }}
    </div>
{% endif %}
于 2013-03-23T01:43:17.763 に答える
4

1つのフラッシュメッセージの場合:

{{ app.session.flashbag.get('success')[0] }}

すべてのために:

{% for type, messages in app.session.flashbag.all() %}
    {% for message in messages %}
        <div class="alert alert-{{ type }}">
            {{ message }}
        </div>
    {% endfor %}
{% endfor %}
于 2013-03-23T12:59:26.197 に答える
1

私はこれを自分で打ったところです。add()の代わりにメソッドを使用していたためですset()

追加と設定の違い:

public function add($type, $message)
{
    $this->flashes[$type][] = $message;
}

上記の場合、この場合は不要な配列が追加されます。

一方:

public function set($type, $messages)
{
    $this->flashes[$type] = (array) $messages;
}

したがって、addが行うことではなく、set()結果が得られます。これは、文字列ではなく配列を渡すため、配列から文字列への変換を引き起こしている原因です。$array[$key] = $value$array[$key][] = $value

于 2015-10-08T11:35:50.653 に答える
0

OK、あなたは自分でこの問題を解決したようですが、これはもっと簡単な方法かもしれません:

{% if app.session.hasFlash('success') %}
    {{ app.session.flash('success') }}
{% endif %}

...少なくともフラッシュメッセージが常に存在することを保証することはできないため;)

于 2013-03-23T07:35:36.420 に答える