2013-03-23 23 views
9

tôi đặt tin nhắn nhấp nháy trong một bộ điều khiển với đoạn mã sau:Symfony2 - Array ngoại lệ chuỗi chuyển đổi với tin nhắn nhấp nháy

$this->get('session')->getFlashBag()->add('success', 'Message sent successfully'); 

Và trong mẫu của tôi, tôi sử dụng sau đây để (cố gắng) hiển thị nó :

{% if app.session.flashbag.has('success') %} 
    <div id="flash"> 
     {{ app.session.flashbag.get('success') }} 
    </div> 
{% endif %} 

Vấn đề là mặc dù tài liệu API nêu rõ rằng get trả về một chuỗi, tôi nhận được một mảng ngoại lệ chuyển đổi chuỗi. Nếu tôi thay đổi mã trong mẫu thành:

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

Nó hoạt động hoàn hảo. Tôi không muốn sử dụng vòng lặp ở đây vì tôi chỉ có thể có một tin nhắn đơn hay không.

Có giải pháp nào mà tôi chỉ có thể kiểm tra sự tồn tại của một thông báo flash và hiển thị nó nếu nó có ở đó không? Hay tôi bị mắc kẹt với một vòng lặp vô dụng?

Trả lời

11

Giải quyết nó bằng cách đánh chỉ số ở mức 0:

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

nghi ngờ của tôi đã đúng - get trả về một mảng chứ không phải là một chuỗi. Dưới đây là phương pháp add của flashbag:

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; 
} 

Họ cần phải sửa chữa tài liệu API để nó phản ánh hiện thực. Họ cũng nên cung cấp một cách thanh lịch để xử lý một thông điệp flash đơn.

EDIT: Một tương thích ngược (PHP 5.3 trở xuống) phiên bản -

{% if app.session.flashbag.has('success') %} 
    {% set flashbag = app.session.flashbag.get('success') %} 
    {% set message = flashbag[0] %} 
    <div id="flash"> 
     {{ message }} 
    </div> 
{% endif %} 
+1

9 tháng và tài liệu vẫn bị tụt hậu – jsgoupil

0

OK, tôi thấy rằng bạn đã giải quyết vấn đề này một mình nhưng điều này có thể là một cách dễ dàng hơn:

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

... vì bạn không thể đảm bảo rằng sẽ luôn có ít nhất thông báo flash;)

+1

Điều đó dễ dàng hơn và là những gì tôi có ban đầu. Vấn đề là cách làm việc đó sẽ không được chấp nhận bởi 2.3, vì thế để cho tương lai tôi quyết định sử dụng túi đèn flash. –

+2

Ah, tôi chưa có thời gian để đọc '2.3' changelog. Cảm ơn bạn về thông tin :) –

4

Đối với một thông báo đèn flash:

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

Đối với tất cả:

{% for type, messages in app.session.flashbag.all() %} 
    {% for message in messages %} 
     <div class="alert alert-{{ type }}"> 
      {{ message }} 
     </div> 
    {% endfor %} 
{% endfor %} 
1

Tôi vừa mới trúng này bản thân mình. Đó là vì tôi đã sử dụng phương pháp add() thay vì set().

Sự khác biệt giữa Add và Set:

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

Trên đây sẽ thêm một mảng phụ trợ không cần thiết trong trường hợp này.

Trong đó:

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

Vì vậy set() kết quả trong $array[$key] = $value, chứ không phải là những gì thêm không, đó là $array[$key][] = $value đó là những gì đang gây ra mảng của bạn để chuyển đổi chuỗi bởi vì bạn đang đi qua một mảng, không phải là một chuỗi.

Các vấn đề liên quan