I set a flash message in a controller with the following code:
$this->get('session')->getFlashBag()->add('success', 'Message sent successfully');
And in my template, I use the following to (attempt to) display it:
{% if app.session.flashbag.has('success') %}
<div id="flash">
{{ app.session.flashbag.get('success') }}
</div>
{% endif %}
The problem is that, despite the API documentation stating that get
returns a string, I'm getting an array to string conversion exception. If I change the code in the template to:
{% for flashMessage in app.session.flashbag.get('success') %}
<div id="flash">
{{ flashMessage }}
</div>
{% endfor %}
It works perfectly. I'd rather not use a loop here since I'm only ever either going to have the single message or not.
Is there a solution where I can just check for the existence of a single flash message and display it if it's there? Or am I stuck with a useless loop?
Solved it by indexing at 0:
{{ app.session.flashbag.get('success')[0] }}
My suspicions were correct - get
returns an array rather than a string. Here's the flashbag's add
method:
public function add($type, $message)
{
$this->flashes[$type][] = $message;
}
And get
:
public function get($type, array $default = array())
{
if (!$this->has($type)) {
return $default;
}
$return = $this->flashes[$type];
unset($this->flashes[$type]);
return $return;
}
They need to fix the API documentation so it reflects reality. They should also provide an elegant way to handle a single flash message.
EDIT: A backwards compatible (PHP 5.3 and below) version -
{% if app.session.flashbag.has('success') %}
{% set flashbag = app.session.flashbag.get('success') %}
{% set message = flashbag[0] %}
<div id="flash">
{{ message }}
</div>
{% endif %}
For one flash message:
{{ app.session.flashbag.get('success')[0] }}
For all:
{% for type, messages in app.session.flashbag.all() %}
{% for message in messages %}
<div class="alert alert-{{ type }}">
{{ message }}
</div>
{% endfor %}
{% endfor %}
I've just hit this myself. It was because I was using the add()
method instead of set()
.
The differences between Add and Set:
public function add($type, $message)
{
$this->flashes[$type][] = $message;
}
The above would add an extra array which isn't required in this case.
Whereas:
public function set($type, $messages)
{
$this->flashes[$type] = (array) $messages;
}
So set()
results in $array[$key] = $value
, rather than what add does, which is $array[$key][] = $value
which is what is causing your Array to string conversion because you're passing an array, not a string.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With