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.

 

[codesyntax lang=»php» title=»El objeto sfUser puede contener atributos personalizados del usuario disponibles en todas las peticiones»]

<?php

class mimoduloActions extends sfActions
{
  public function executePrimeraPagina($peticion)
  {
    $nombre = $peticion->getParameter('nombre');

    // Guardar información en la sesión del usuario
    $this->getUser()->setAttribute('nombre', $nombre);
  }

  public function executeSegundaPagina()
  {
    // Obtener información de la sesión del usuario con un valor por defecto
    $nombre = $this->getUser()->getAttribute('nombre', 'Anónimo');
  }
}

[/codesyntax]

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:

[codesyntax lang=»php» title=»Eliminando información de la sesión del usuario»]

<?php

class mimoduloActions extends sfActions
{
  public function executeBorraNombre()
  {
    $this->getUser()->getAttributeHolder()->remove('nombre');
  }

  public function executeLimpia()
  {
    $this->getUser()->getAttributeHolder()->clear();
  }
}

[/codesyntax]

[codesyntax lang=»php» title=»Las plantillas también tienen acceso a los atributos de la sesión del usuario»]

<p>
  Hola, <?php echo $sf_user->getAttribute('nombre') ?>
</p>

[/codesyntax]

 

ATRIBUTOS FLASH

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

[codesyntax lang=»php»]

<?php

//Creamos el atributo en la primera acción
$this->getUser()->setFlash('atributo', $valor);

//Recuperamos el atributo en la segunda acción
$valor = $this->getUser()->getFlash('atributo');

//Después en la siguiente petición el atributo se eliminará

//En la plantilla podemos llamarlo de la siguiente manera:
<?php if ($sf_user->hasFlash('atributo')): ?>
  <?php echo $sf_user->getFlash('atributo') ?>
<?php endif; ?>

//O de una forma más simple:
<?php echo $sf_user->getFlash('atributo') ?>

[/codesyntax]

 

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:

[codesyntax lang=»text»]

all:
  storage:
    class: sfSessionStorage
    param:
      session_name: mi_nombre_cookie

[/codesyntax]

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:

[codesyntax lang=»text»]

all:
  storage:
    class: sfMySQLSessionStorage
    param:
      db_table:    session    # Nombre de la tabla que guarda las sesiones
      database:    propel     # Nombre de la conexión a base de datos que se utiliza
      # Parámetros opcionales
      db_id_col:   sess_id    # Nombre de la columna que guarda el identificador de la sesión
      db_data_col: sess_data  # Nombre de la columna que guarda los datos de la sesión
      db_time_col: sess_time  # Nombre de la columna que guarda el timestamp de la sesión

[/codesyntax]

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):

[codesyntax lang=»text»]

all:
  user:
    class:       myUser
    param:
      timeout:   1800           # Tiempo de vida de la sesión en segundos

[/codesyntax]