El primer parámetro de todas las acciones (que habitualmente hemos llamado $peticion) representa un objeto llamado sfWebRequest. Ya conocemos uno de sus métodos que nos devuelve el valor de un parámetro, getParameter(‘miparametro’). En el capítulo del libro de Symfony podéis ver una tabla con los métodos más utilizados de el objeto sfWebRequest.

 

SESIONES

Para acceder a la sesión del usuario utilizamos getUser() que es una instancia de la clase sfUser. Se pueden guardar cualquier tipo de dato excepto objetos, el motivo es que entre una petición y otra el objeto de la sesión se serializa.

 

  1. <?php
  2.  
  3. class mimoduloActions extends sfActions
  4. {
  5. public function executePrimeraPagina($peticion)
  6. {
  7. $nombre = $peticion->getParameter('nombre');
  8.  
  9. // Guardar información en la sesión del usuario
  10. $this->getUser()->setAttribute('nombre', $nombre);
  11. }
  12.  
  13. public function executeSegundaPagina()
  14. {
  15. // Obtener información de la sesión del usuario con un valor por defecto
  16. $nombre = $this->getUser()->getAttribute('nombre', 'Anónimo');
  17. }
  18. }

Para verificar si un atributo ha sido definido para un usuario, se utiliza el método hasAttribute(). Los atributos se guardan en un contenedor de parámetros que puede ser accedido por el método getAttributeHolder(). También permite un borrado rápido de los atributos del usuario con los métodos usuales del contenedor de parámetros:

  1. <?php
  2.  
  3. class mimoduloActions extends sfActions
  4. {
  5. public function executeBorraNombre()
  6. {
  7. $this->getUser()->getAttributeHolder()->remove('nombre');
  8. }
  9.  
  10. public function executeLimpia()
  11. {
  12. $this->getUser()->getAttributeHolder()->clear();
  13. }
  14. }
  1. <p>
  2. Hola, <?php echo $sf_user->getAttribute('nombre') ?>
  3. </p>

 

ATRIBUTOS FLASH

El atributo flash permite crear variables que serán destruidas después de la siguiente petición:

  1. <?php
  2.  
  3. //Creamos el atributo en la primera acción
  4. $this->getUser()->setFlash('atributo', $valor);
  5.  
  6. //Recuperamos el atributo en la segunda acción
  7. $valor = $this->getUser()->getFlash('atributo');
  8.  
  9. //Después en la siguiente petición el atributo se eliminará
  10.  
  11. //En la plantilla podemos llamarlo de la siguiente manera:
  12. <?php if ($sf_user->hasFlash('atributo')): ?>
  13. <?php echo $sf_user->getFlash('atributo') ?>
  14. <?php endif; ?>
  15.  
  16. //O de una forma más simple:
  17. <?php echo $sf_user->getFlash('atributo') ?>

 

MANEJO DE SESIONES

El manejo de sesiones de Symfony se encarga de gestionar automáticamente el almacenamiento de los IDs de sesión tanto en el cliente como en el servidor. Sin embargo, si se necesita modificar este comportamiento por defecto, es posible hacerlo.

En el lado del cliente, las sesiones son manejadas por cookies. La cookie de Symfony se llama Symfony, pero se puede cambiar su nombre editando el archivo de configuración factories.yml:

  1. all:
  2. storage:
  3. class: sfSessionStorage
  4. param:
  5. session_name: mi_nombre_cookie

En el lado del servidor, Symfony guarda por defecto las sesiones de usuario en archivos. Se pueden almacenar en la base de datos cambiando el valor del parámetro class en factories.yml:

  1. all:
  2. storage:
  3. class: sfMySQLSessionStorage
  4. param:
  5. db_table: session # Nombre de la tabla que guarda las sesiones
  6. database: propel # Nombre de la conexión a base de datos que se utiliza
  7. # Parámetros opcionales
  8. db_id_col: sess_id # Nombre de la columna que guarda el identificador de la sesión
  9. db_data_col: sess_data # Nombre de la columna que guarda los datos de la sesión
  10. db_time_col: sess_time # Nombre de la columna que guarda el timestamp de la sesión

La opción database define el nombre de la conexión a base de datos que se utiliza. Posteriormente, Symfony utiliza el archivo databases.yml para determinar los parámetros con los que realiza la conexión (host, nombre de la base de datos, usuario y password).

Las clases disponibles para el almacenamiento de sesiones son sfMySQLSessionStorage, sfMySQLiSessionStorage, sfPostgreSQLSessionStorage y sfPDOSessionStorage. La clase recomendada es sfPDOSessionStorage. Para deshabilitar completamente el almacenamiento de las sesiones, se puede utilizar la clase sfNoStorage.

La expiración de la sesión se produce automáticamente después de 30 minutos. El valor de esta opción se puede modificar para cada entorno en el mismo archivo de configuración factories.yml, concretamente en la factoría correspondiente al usuario (user):

  1. all:
  2. user:
  3. class: myUser
  4. param:
  5. timeout: 1800 # Tiempo de vida de la sesión en segundos