我在控制器中设置了一个flash消息,代码如下:
$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 %}
效果很好。我不想在这里使用循环,因为我只会有一个消息,或者没有。
是否有一个解决方案,我可以检查是否存在单个flash消息并显示它,如果它在那里?还是说我陷入了一个无用的循环?
通过在0处索引来解决:
{{ app.session.flashbag.get('success')[0] }}
我的怀疑是正确的- get
返回一个数组而不是字符串。以下是flashbag的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文档,使其反映现实。它们还应该提供一种优雅的方式来处理单个flash消息。
编辑:一个向后兼容的(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 %}
对于一个flash消息:
{{ 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 %}
…因为你不能保证至少会有flash消息;)