Zend\Session
Zend\Session là thư viện trừu tượng hóa tương tác với biến $_SESSION
của PHP, là cơ chế trong PHP cho phép lưu dữ liệu ở trang này
và đọc được ở trang khác trong cùng một phiên làm việc. Việc sử dụng session trong PHP cơ bản cũng không quá phức tạp.
Để dùng thư viện Zend\Session cần đảm bảo đã tích hợp vào dự án với câu lệnh composer
composer require zendframework/zend-session
Để ứng dụng Skeleton sử dụng được, bạn cần đảm bảo đã có dòng Zend\Session
trong modules.config.php
Sử dụng Session trong ZendFramework cơ bản bạn cần có mộc dịch vụ quản lý session chung trong toàn hệ thống gọi là
Session Manager (Zend\Session\SessionManager
) và các đối tượng Zend\Session\Container
để sử dụng lưu / lấy giá trị session trong các tình huống cụ thể.
Để cấu hình và có thể khởi tạo được SessionManager
cần có một mảng biểu diễn cấu hình Session của hệ thống trước, sau đó sử dụng mạng này để khởi tạo.
Mảng cấu hình Session
Mảng dùng để khởi tạo nên Session Manager có thể có các giá trị sau, tùy thuộc vào cách dùng của bạn:
$session_config = [ 'cache_expire' => 30, //session.cache_expire 'cookie_domain' => '', //session.cookie_domain 'cookie_httponly' => true, //session.cookie_httponly 'cookie_lifetime' => 60*60*1,//session.cookie_lifetime, 'cookie_path' => '/', //session.cookie_path, 'name' => 'nameyoursession', 'use_cookies' => 1, ... ]
Ví dụ tạo ra Session Manager
:
//Trong Skeleton đoạn code dưới đây không cần triển khai, //mà chỉ cần cấu hình theo hệ thống config - xem phần dưới $session_config = [ 'remember_me_seconds' => 604800, 'cookie_lifetime'=>604800, 'use_cookies' => true, 'cookie_httponly' => true, 'name'=>'xtlab' ] $sessionConfig = new SessionConfig(); $sessionConfig->setOptions($config); $sessionManager = new SessionManager($sessionConfig); //Thiết lập đây là Session Manager mặc định Container::setDefaultManager($sessionManager);
Cấu hình Session Manager trong Skeleton Application ZF
Đoạn mã ví dụ ở trên bạn không cần sử dụng trong Skeleton, mà bạn chỉ cần khai báo thông số trong hệ thống config (thường khai báo ở file config/autoload/global.php
, tùy nhiên
thực tế bạn có thể khai báo ở bất kỳ vị trí nào trong hệ thống config (cấp độ ứng dụng, cấp độ module ...)
Vị dụ bạn thêm các thông số sau vào ngay config của module: module.config.php
config/module.config.php
'session_config' => [ 'cookie_lifetime' => 60*60*3, // Session lưu 30 trên server 'gc_maxlifetime' => 60*60*24*30, 'use_cookies' => true, 'cookie_httponly' => true, 'name'=>'xtlab' ], 'session_storage' => [ 'type' => SessionArrayStorage::class, ], 'session_manager' => [ 'validators' => [ //Thêm các Validator khi tạo Session, nếu không thỏa mãn //validator sẽ dẫn tới lỗi tạo Session \Zend\Session\Validator\RemoteAddr::class, \Zend\Session\Validator\HttpUserAgent::class, ], ],
Nếu hệ thống có đoạn cấu hình trên trong config, thì bất kỳ khi nào muốn có đối tượng Session Manager chỉ việc sử dụng:
$sessionmanager = $servicemanage->get(\Zend\Session\SessionManager::class)
Hoặc đơn giản hơn:
$sessionmanager = Container::getDefaultManager()
Các phương thức Session Manager
Method | Description |
---|---|
sessionExists() |
Kiểm tra tồn tại session. |
start($preserveStorage) |
Khởi động Session |
destroy($options) |
Kết thúc Session. |
getId() |
Session ID. |
setId() |
Thiết lập Session ID. |
regenerateId() |
Phát sinh ID. |
getName() |
Tên session. |
setName() |
Thiết lập tên session, thay thế tên mặc định trong php.ini. |
rememberMe($ttl = null) |
Thiết lập thời gian tồn tại của Session (giây) |
forgetMe() |
Thời gian tồn tại của Session là 0 giây |
expireSessionCookie() |
Cookie hết hạn ngay lập tức |
isValid() |
Thi hành các Validator |
Sử dụng Session với Container
Sau khi hệ thống config có Session Manager như trên, nó sẽ mặc định được sử dụng với các đối tượng Container
Mỗi một đối tượng Container
được tạo ra cần có một cái tên gọi là ContainerNamespace
Ví dụ ở bất kỳ đâu muốn lưu Session thì bạn chỉ cần khởi tạo và thiết lập giá trị cần lưu vào Container
//'MyContainerSS' là ContainerNamespace $sscontainer = new \Zend\Session\Container('MyContainerSS'); //Hai kiểu gán giá trị $sscontainer['name'] = 'XuanThuLab'; $sscontainer->nation = 'VietNam';
Ở một trang khác hoặc thời điểm khác muốn đọc lại Session trong Container trên thì
$sscontainer = new \Zend\Session\Container('MyContainerSS'); //Lấy giá trị $name = $sscontainer->name; $nation = $sscontainer['nation']; //Hủy một biến unset($sscontainer->myVar);
Ngoài cách khởi tạo ra Container như trên, thì cách hay hơn khởi khai báo các ContainerNamespace trong config để khởi tạo bằng factory
'session_containers' => [ 'MyContainerSS', //..Các ContainerNamespace khác ],
Sau đó trong ứng úng dụng lấy Container bằng cách:
$sessionmanager->get('ContainerNamespace');