代码之家  ›  专栏  ›  技术社区  ›  Major Productions

Symfony2-数组到字符串的转换异常,带有一条闪烁消息

  •  9
  • Major Productions  · 技术社区  · 11 年前

    我在控制器中设置了一条闪烁消息,代码如下:

    $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 回复  |  直到 11 年前
        1
  •  11
  •   Major Productions    11 年前

    通过在0处进行索引解决了问题:

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

    我的怀疑是正确的- get 返回一个数组而不是字符串。这是手电筒的 add 方法:

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

    收到 :

    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 %}
    
        2
  •  4
  •   mkjasinski    11 年前

    对于一条闪烁信息:

    {{ 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 %}
    
        3
  •  1
  •   Matt Cavanagh    9 年前

    我自己刚刚打过这个。这是因为我在使用 add() 方法而不是 set() .

    Add和Set之间的区别:

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

    上面的内容将添加一个额外的数组,在这种情况下不需要这个数组。

    鉴于:

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

    所以 设置() 结果在 $array[$key] = $value ,而不是add的作用 $array[$key][] = $value 这就是导致数组到字符串转换的原因,因为您传递的是数组,而不是字符串。

        4
  •  0
  •   Jovan Perovic    11 年前

    好吧,我知道你已经自己解决了这个问题,但这可能是一个更容易的方法:

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

    ……因为你不能保证至少会有闪光信息;)