ZFE provee un servicio especial llamando SessionManager
que pertenece al espacio de nombres Zend\Session
. Este servicio
es un servicio común de ZF3 y se registra automáticamente en el manejador de servicios. Podemos tener una instancia del servicio
SessionManager
en una factory class con el siguiente código:
// Use alias for the SessionManager class.
use Zend\Session\SessionManager;
// Retrieve an instance of the session manager from the service manager.
$sessionManager = $container->get(SessionManager::class);
Pero, ¿Que hace el SessionManager
? De hecho él hace todo para que la sesión se ejecute.
Un resumen de sus métodos más utíles se muestra en la table 15.1 más abajo:
Método | Descripción |
---|---|
sessionExists() |
Revisa si una sesión existe y si esta actualmente activada. |
start($preserveStorage = false) |
Comienza la sesión (si aún no esta iniciada). |
destroy(array $options = null) |
Termina una sesión. |
getId() |
Regresa el ID de la sesión. |
setId() |
Coloca un ID a la sesión. |
regenerateId() |
Regenera el ID de la sesión. |
getName() |
Regresa el nombre de la sesión. |
setName() |
Sobreescribe el valor original para le nombre de sesión del php.ini. |
rememberMe($ttl = null) |
Coloca el tiempo de vida de la cookie de sesión (en segundos). |
forgetMe() |
Coloca en cero la vida para la cookie de sesión (la cookie expira cuando el navegador se cierra). |
expireSessionCookie() |
Expira la cookie de sesión inmediatamente. |
isValid() |
Ejecuta los validadores de sesión. |
Como podemos ver e la tabla de arriba el SessionManager
puede comenzar la sesión y terminarla, revisar si la sesión existe y colocar los parámetros
de sesión (como el momento de expiración de la cookie). Además, el manejador provee una cadena validadora que puede contener validadores de sesión
(estos validadores permiten prevenir ataques a la información de sesión).
La clase SessionManager
al inicializar lee la configuración de la aplicación,
así podemos poner los parámetros de sesión convenientemente. Para hacer esto modificamos nuestro APP_DIR/config/autoload/global.php
de la siguiente manera:
<?php
use Zend\Session\Storage\SessionArrayStorage;
use Zend\Session\Validator\RemoteAddr;
use Zend\Session\Validator\HttpUserAgent;
return [
// Session configuration.
'session_config' => [
// Session cookie will expire in 1 hour.
'cookie_lifetime' => 60*60*1,
// Session data will be stored on server maximum for 30 days.
'gc_maxlifetime' => 60*60*24*30,
],
// Session manager configuration.
'session_manager' => [
// Session validators (used for security).
'validators' => [
RemoteAddr::class,
HttpUserAgent::class,
]
],
// Session storage configuration.
'session_storage' => [
'type' => SessionArrayStorage::class
],
// ...
];
Modificamos el archivo
global.php
porque de esta manera las sesiones pueden ser usadas por cualquier modulo de nuestro sitio web y no dependen del entorno.
Como podemos ver la configuración de sesión se almacena en tres llaves:
La llave session_config
permite definir el tiempo de vida de la cookie y por cuanto tiempo el motor PHP
almacenará nuestra información de sesión en el servidor.
En realidad esta llave puede contener opciones de sesión adicionales, pero las omitimos por simplicidad (si queremos sobreescribir
estas opciones avanzadas debemos revisar le documentación de Zend Framework).
La llave session_manager
permite colocar validadores de sesión. Estos se usan para aumentar la seguridad. Se recomienda
que siempre se especifiquen estas validaciones aquí.
La llave session_storage
permite especificar la clase de almacenamiento de sesión. Usamos la clase SessionArrayStorage
que es
el almacenamiento por defecto y es suficiente en la mayoría de los casos.
En ZF3 muchos componentes usan el manejo de sesión implícitamente (por ejemplo, el controller plugin y view helper de FlashMessenger
usan
sesiones para guardar mensajes entre peticiones HTTP). Para permitir que cada componente use el manejador de sesiones necesitamos configurarlo,
tendremos que hacerlo "predeterminado" instanciando al manejador tan pronto como sea posible. Por ejemplo, podemos
instanciar el manejador de sesiones en nuestro método de modulo onBootstrap()
, de la siguiente manera:
<?php
namespace Application;
use Zend\Mvc\MvcEvent;
use Zend\Session\SessionManager;
class Module
{
//...
/**
* This method is called once the MVC bootstrapping is complete.
*/
public function onBootstrap(MvcEvent $event)
{
$application = $event->getApplication();
$serviceManager = $application->getServiceManager();
// The following line instantiates the SessionManager and automatically
// makes the SessionManager the 'default' one.
$sessionManager = $serviceManager->get(SessionManager::class);
}
}
Hacer al manejador de sesiones predeterminado es muy importante porque de otra manera tendremos que pasarlo a cada componente que dependa del manejador, lo que es bastante aburrido.