A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

15.3. El manejador de sesiones

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:

Table 15.1. Métodos que provee las clase SessionManager
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).

15.3.1. Establecer una configuració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:

15.3.2. Hacer al manejador de sesiones predeterminado

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.


Top