Симфония 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 %}
Это работает отлично. Я бы предпочел не использовать здесь цикл, так как у меня будет только одно сообщение или нет.
Есть ли решение, в котором я могу просто проверить наличие одного флэш-сообщения и отобразить его, если оно есть? Или я застрял в бесполезном цикле?
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 %}
Для одного флэш-сообщения:
{{ 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 %}
Я только что сам до этого дошел. Это было потому, что я использовал метод 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
, что приводит к преобразованию вашего массива в строку, потому что вы передаете массив, а не строку.
Хорошо, я вижу, что вы решили эту проблему самостоятельно, но это может быть более простым способом:
{% if app.session.hasFlash('success') %}
{{ app.session.flash('success') }}
{% endif %}
...так как вы не можете гарантировать, что всегда будет хотя бы флэш-сообщение;)