CodeIgnitor: Thư viện Session - Flashdata và Tempdata
Flashdata
CodeIgniter hỗ trợ "flashdata", là những session chỉ được sử dụng một lần và sẽ được xóa tự động.
Điều này có thể rất hữu dụng, đặc biệt là cho một lần cung cấp thông tin, lỗi hoặc các thông báo trạng thái.
Cần lưu ý rằng các biến flashdata là các biến session thông thường, chỉ khác ở một điểm là có thêm key '__ci_vars'.
Nếu bạn muốn đánh dấu một biến session nào đó là "flashdata" thì bạn có thể làm như sau:
$this->session->mark_as_flash('name');
Nếu bạn muốn đánh dấu cùng lúc nhiều biến thành flashdata thì bạn làm như sau:
$this->session->mark_as_flash(array('name1', 'name2'));
Để thêm một flashdata ta làm như sau:
$_SESSION['name'] = 'value'; $this->session->mark_as_flash('name');
Ngoài ra, ta cũng có thể sử dụng phương thức set_flashdata():
$this->session->set_flashdata('item', 'value');
Bạn cũng có thể truyền một mảng tới set_flashdata() giống như với hàm set_userdata().
Để đọc dữ liệu trong một biến flashdata thì ta cũng làm tương tự như dữ liệu session với $_SESSION:
echo $_SESSION['item']
Quan trọng:
Phương thức userdata() sẽ không trả về các biến flashdata.
Nếu bạn chỉ muốn làm việc với biến "flashdata" thì bạn có thể sử dụng phương thức flashdata():
$this->session->flashdata('item');
Hoặc nếu bạn muốn lấy tất cả các biến flashdata thì bạn làm như sau:
$this->session->flashdata();
Lưu ý:
Phương thức flashdata() trả về NULL nếu item không phải là flashdata.
Nếu bạn thấy rằng bạn cần phải bảo quản một biến flashdata thông qua một yêu cầu bổ sung thì bạn có thể sử dụng phương thức keep_flashdata(). Bạn có thể truyền một biến hoặc một mảng flashdata tới phương thức để bảo quản.
$this->session->keep_flashdata('item'); $this->session->keep_flashdata(array('item1', 'item2', 'item3'));
Tempdata
CodeIgniter cũng hỗ trợ “tempdata”, đây là loại dữ liệu session có thời gian hết hạn xác định. Sau khi hết hạn giá trị hoặc hết hạn session hoặc hết bị xóa, thì giá trị của tempdata tự động bị xóa.
Tương tự như flashdata, các biến tempdata là những biến session chính quy được đánh dấu bằng key ‘__ci_vars’.
Để đánh dấu một biến là “tempdata” thì đơn giản là bạn truyền key của nó và thời gian hết hạn (bằng giây-second) tới phương thức mark_as_temp():
// 'item' sẽ bị xóa sau 300 seconds $this->session->mark_as_temp('item', 300);
Bạn cũng có thể đánh dấu cùng lúc nhiều biến là tempdata bằng hai cách sau, phụ thuộc vào việc bạn muốn tất cả chúng có cùng thời gian hết hạn hay không:
// Cả 'item' và 'item2' sẽ hết hạn sau 300 seconds $this->session->mark_as_temp(array('item', 'item2'), 300); // 'item' sẽ bị xóa sau 300 seconds, còn 'item2' // bị xóa sau 240 seconds $this->session->mark_as_temp(array( 'item' => 300, 'item2' => 240 ));
Để thêm một biến tempdata:
$_SESSION['item'] = 'value'; $this->session->mark_as_temp('item', 300);
Hoặc có thể thêm bằng cách dùng phương thức set_tempdata():
$this->session->set_tempdata('item', 'value', 300);
Bạn cũng có thể thêm cùng lúc nhiều tempdata bằng cách truyền một mảng tới set_tempdata():
$tempdata = array('newuser' => TRUE, 'message' => 'Thanks for joining!'); $this->session->set_tempdata($tempdata, NULL, $expire);
Lưu ý:
Nếu giá trị hết hạn không được đặt hoặc được đặt là 0 thì giá trị mặc định là 300 giây (5 phút) sẽ được sử dụng.
Để đọc một biến tempdata ta lại sử dụng mảng $_SESSION superglobal:
$_SESSION['item']
Quan trọng:
Phương thức userdata() sẽ không trả về biến tempdata.
Hoặc nếu bạn muốn đảm bảo rằng bạn đang đọc biến tempdata mà không phải là loại nào khác thì bạn dùng phương thức tempdata():
$this->session->tempdata('item');
Và đương nhiên, nếu bạn muốn truy xuất đến tất cả các tempdata đã có thì bạn sử dụng:
$this->session->tempdata();
Lưu ý:
Phương thức tempdata() trả về NULL nếu không tìm thấy biến tempdata.
Nếu bạn cần xóa một giá trị tempdata trước khi nó hết hạn thì bạn có thể trực tiếp unset nó từ mảng $_SESSION:
unset($_SESSION['item']);
Tuy nhiên, điều này sẽ không xóa được marker đã đánh dấu biến là tempdata (nó sẽ không có giá trị ở lần yêu cầu HTTP tiếp theo), cho nên nếu bạn muốn sử dụng khóa tương tự trong cùng một yêu cầu thì bạn dùng phương thức unset_tempdata():
$this->session->unset_tempdata('item');