2011-12-06 33 views
45

Tôi đã tìm kiếm rất nhiều trên mạng cách truy cập mảng toàn cầu $_SESSION từ mẫu TWIG và tìm thấy điều này: {{app.session.get('index')}}, nhưng khi tôi gọi nó, nó trả về một chuỗi rỗng. Tôi có số $_SESSION['filter']['accounts'] và tôi gặp phải lỗi này khi gọi {{app.session.get('filter').accounts}}: Item "accounts" for "" does not exist. Tôi đang làm gì sai?Truy cập phiên từ mẫu TWIG

+10

KHÔNG sử dụng $ _SESSION trong Symfony! – Gigala

Trả lời

118

{{app.session}} đề cập đến đối tượng Session chứ không phải là mảng $_SESSION. Tôi không nghĩ rằng mảng $_SESSION có thể truy cập trừ khi bạn chuyển nó một cách rõ ràng đến mọi mẫu Twig hoặc nếu bạn thực hiện một tiện ích mở rộng làm cho nó khả dụng.

Symfony2 là hướng đối tượng, vì vậy bạn nên sử dụng đối tượng Session để đặt thuộc tính phiên và không dựa vào mảng. Đối tượng Session sẽ trừu tượng hóa công cụ này khỏi bạn, vì vậy, việc lưu trữ phiên trong cơ sở dữ liệu dễ dàng hơn vì lưu trữ biến phiên bị ẩn khỏi bạn.

Vì vậy, hãy đặt thuộc tính của bạn trong phiên và truy lục giá trị trong mẫu cành của bạn bằng cách sử dụng đối tượng Session.

// In a controller 
$session = $this->get('session'); 
$session->set('filter', array(
    'accounts' => 'value', 
)); 

// In Twig 
{% set filter = app.session.get('filter') %} 
{% set account-filter = filter['accounts'] %} 

Hy vọng điều này sẽ hữu ích.

Kính trọng,
Matt

+1

cảm ơn :) điều này đã giúp tôi P.S. bạn cần thay đổi câu trả lời của bạn như sau: '$ session-> set ('filter', array ('accounts' => 'value'));' – haynar

+0

Điều gì sẽ xảy ra nếu các phiên được lưu trong Memcached? – Sekai

+0

@Sekai không làm cho một differnce tôi sẽ nói nếu bạn cấu hình nó một cách chính xác – Gigala

20

Một thủ thuật đơn giản là xác định các mảng $ _SESSION như là một biến toàn cầu. Cho rằng, chỉnh sửa file core.php trong thư mục mở rộng bằng cách thêm chức năng này:

public function getGlobals() { 
    return array(
     'session' => $_SESSION, 
    ) ; 
} 

Sau đó, bạn sẽ có thể acces bất kỳ biến phiên như:

{{ session.username }} 

nếu bạn muốn truy cập vào

$_SESSION['username'] 
+6

Đây là một câu trả lời tốt hơn nhiều so với ở trên, cho rằng bạn có thể sử dụng Twig mà không cần sử dụng Symfony. – gazarsgo

+6

Thay vì chỉnh sửa core.php mặc dù theo các tài liệu ở đây: http://twig.sensiolabs.org/doc/advanced.html – gazarsgo

+2

@gazarsgo Cả hai giải pháp đều tuyệt vời. – pregmatch

0

Tại sao bạn không sử dụng {{app.object name.field name}} để truy cập biến?

5

Tôi thấy rằng cách sạch nhất để làm điều này là tạo TwigExtension tùy chỉnh và ghi đè phương thức getGlobals() của nó. Thay vì sử dụng $_SESSION, bạn cũng nên sử dụng lớp Session của Symfony vì nó xử lý tự động bắt đầu/dừng phiên.

Tôi đã có phần mở rộng sau trong /src/AppBundle/Twig/AppExtension.php:

<?php  
namespace AppBundle\Twig; 

use Symfony\Component\HttpFoundation\Session\Session; 

class AppExtension extends \Twig_Extension { 

    public function getGlobals() { 
     $session = new Session(); 
     return array(
      'session' => $session->all(), 
     ); 
    } 

    public function getName() { 
     return 'app_extension'; 
    } 
} 

Sau đó thêm này trong /app/config/dịch vụ.yml:

services: 
    app.twig_extension: 
     class: AppBundle\Twig\AppExtension 
     public: false 
     tags: 
      - { name: twig.extension } 

Sau đó, phiên giao dịch có thể được truy cập từ bất kỳ quan điểm sử dụng:

{{ session.my_variable }} 
+0

Thx cho giải pháp tuyệt vời này – Elium1984

+0

Điều này là tốt đẹp. Làm thế nào tôi có thể thiết lập một biến phiên trong cành bằng cách sử dụng giải pháp này ?? – Ranhot

+0

@Ranhot, bạn không nên đặt biến phiên trong chế độ xem twig. Điều đó nên được thực hiện trong bộ điều khiển hoặc dịch vụ. –

12

Cài đặt cành

$twig = new Twig_Environment(...);  
$twig->addGlobal('session', $_SESSION); 

Sau đó trong mẫu giá trị phiên truy cập của bạn ví dụ

$_SESSION['username'] in php file Will be equivalent to {{ session.username }} in your twig template 
+0

Đây là một câu trả lời tuyệt vời. – VSG24

+0

Có, câu trả lời tuyệt vời. – JimB814

+0

Cảm ơn bạn! @ user1279047 –

7

Cách truy cập biến phiên trong Twig là:

{{ app.session.get('name_variable') }} 
Các vấn đề liên quan