TigerZF
🌐Español

9.2. Gestión de sesiones de usuario en ZF

9.2.1. Introducción a las sesiones

El éxito de la web está profundamente arraigado en el protocolo que impulsa la web: HTTP. HTTP sobre TCP es por su propia naturaleza sin estado (stateless), lo que significa que, en esencia, la web también carece de estado. Aunque este aspecto es uno de los factores dominantes por los que la web se ha convertido en un medio tan popular, también causa un problema interesante para los desarrolladores que desean usar la web como plataforma de aplicaciones.

El acto de interactuar con una aplicación web se define típicamente por la suma de todas las peticiones enviadas a un servidor web. Dado que puede haber muchos consumidores siendo atendidos simultáneamente, la aplicación debe decidir qué peticiones pertenecen a qué consumidor. Estas peticiones se conocen habitualmente como una "sesión".

En PHP, el problema de la sesión se resuelve mediante la extensión de sesiones, que utiliza algún tipo de seguimiento de estado, típicamente cookies, y alguna forma de almacenamiento local que se expone a través de la superglobal $_SESSION. En Zend Framework, el componente Zend_Session añade valor a la extensión de sesiones de PHP facilitando su uso y su integración dentro de aplicaciones orientadas a objetos.

9.2.2. Uso básico de Zend_Session

El componente Zend_Session es tanto un gestor de sesiones como una API para almacenar datos en un objeto de sesión para su persistencia a largo plazo. La API de Zend_Session sirve para gestionar las opciones y el comportamiento de una sesión, como las opciones, el inicio y la detención de una sesión, mientras que Zend_Session_Namespace es el objeto real utilizado para almacenar datos.

Aunque generalmente es una buena práctica iniciar una sesión dentro de un proceso de arranque, esto en general no es necesario, ya que todas las sesiones se iniciarán automáticamente en la primera creación de un objeto Zend_Session_Namespace.

Zend_Application es capaz de configurar Zend_Session por usted como parte del sistema Zend_Application_Resource. Para usar esto, suponiendo que su proyecto utiliza Zend_Application para el arranque, tendría que añadir el siguiente código a su archivo application.ini:

resources.session.save_path = APPLICATION_PATH "/../data/session"
resources.session.use_only_cookies = true
resources.session.remember_me_seconds = 864000

Como puede ver, las opciones que se pasan son las mismas opciones que cabría esperar encontrar en la extensión ext/session de PHP. Esas opciones configuran la ruta hacia los archivos de sesión donde se almacenarán los datos dentro del proyecto. Dado que los archivos INI pueden además usar constantes, lo anterior usará la constante APPLICATION_PATH y apuntará de forma relativa a un directorio de datos de sesión.

La mayoría de los componentes de Zend Framework que utilizan sesiones no necesitan nada más para usar Zend_Session. Llegados a este punto, puede usar un componente que consuma Zend_Session, o comenzar a almacenar sus propios datos dentro de una sesión con Zend_Session_Namespace.

Zend_Session_Namespace es una clase simple que redirige datos a través de una API fácil de usar hacia la superglobal $_SESSION gestionada por Zend_Session. La razón por la que se llama Zend_Session_Namespace es que en efecto crea un espacio de nombres para los datos dentro de $_SESSION, permitiendo así que múltiples componentes y objetos almacenen y recuperen datos de forma segura. En el siguiente código, exploraremos cómo construir un simple contador de sesión incremental, comenzando en 1000 y reiniciándose a sí mismo después de 1999.

$mysession = new Zend_Session_Namespace('mysession');

if (!isset($mysession->counter)) {
    $mysession->counter = 1000;
} else {
    $mysession->counter++;
}

if ($mysession->counter > 1999) {
    unset($mysession->counter);
}

Como puede ver arriba, el objeto de espacio de nombres de sesión utiliza los métodos mágicos __get, __set, __isset y __unset para permitirle interactuar de forma fluida y sin complicaciones con la sesión. La información almacenada en el ejemplo anterior se guarda en $_SESSION['mysession']['counter'].

9.2.3. Uso avanzado de Zend_Session

Además, si quisiera usar el gestor de almacenamiento (save handler) DbTable para Zend_Session, tendría que añadir el siguiente código a su application.ini:

resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
resources.session.saveHandler.options.name = "session"
resources.session.saveHandler.options.primary.session_id = "session_id"
resources.session.saveHandler.options.primary.save_path = "save_path"
resources.session.saveHandler.options.primary.name = "name"
resources.session.saveHandler.options.primaryAssignment.sessionId = "sessionId"
resources.session.saveHandler.options.primaryAssignment.sessionSavePath = "sessionSavePath"
resources.session.saveHandler.options.primaryAssignment.sessionName = "sessionName"
resources.session.saveHandler.options.modifiedColumn = "modified"
resources.session.saveHandler.options.dataColumn = "session_data"
resources.session.saveHandler.options.lifetimeColumn = "lifetime"