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');

Đăng ký nhận bài viết mới