Симфония 2 - Исключение преобразования массива в строку с флэш-сообщением


Я установил флэш-сообщение в контроллере со следующим кодом:

$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 %}

Проблема в том, что, несмотря на документацию API, в которой указано, что get возвращает строку, я получаю исключение преобразования массива в строку. Если я изменю код в шаблоне на:

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

Это работает отлично. Я бы предпочел не использовать здесь цикл, так как у меня будет только одно сообщение или нет.

Есть ли решение, в котором я могу просто проверить наличие одного флэш-сообщения и отобразить его, если оно есть? Или я застрял в бесполезном цикле?

Author: Major Productions, 2013-03-23

4 answers

Решил ее путем индексации на 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 %}
 11
Author: Major Productions, 2013-03-23 14:49:49

Для одного флэш-сообщения:

{{ 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 %}
 4
Author: mkjasinski, 2013-03-23 12:59:26

Я только что сам до этого дошел. Это было потому, что я использовал метод add() вместо set().

Различия между Add и Set:

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

Вышесказанное добавило бы дополнительный массив, который в данном случае не требуется.

Принимая во внимание, что:

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

Таким образом, set() приводит к $array[$key] = $value, а не к тому, что делает add, то есть $array[$key][] = $value, что приводит к преобразованию вашего массива в строку, потому что вы передаете массив, а не строку.

 1
Author: Matt Cavanagh, 2015-10-08 11:35:50

Хорошо, я вижу, что вы решили эту проблему самостоятельно, но это может быть более простым способом:

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

...так как вы не можете гарантировать, что всегда будет хотя бы флэш-сообщение;)

 0
Author: Jovan Perovic, 2013-03-23 07:35:36