Ver índice de contenidos del libro

A.10. SessionServiceProvider

El proveedor SessionServiceProvider proporciona un servicio para almacenar información de forma persistente entre diferentes peticiones.

A.10.1. Parámetros de configuración

El proveedor define los siguientes parámetros configurables:

  • session.storage.save_path (opcional): indica la ruta donde guarda su información la clase NativeFileSessionHandler. Su valor por defecto es igual al valor devuelto por la función sys_get_temp_dir().
  • session.storage.options: array de opciones que se pasa al constructor del servicio session.storage. Cuando se utiliza la clase NativeSessionStorage, las opciones disponibles son:

    • name: el nombre de la cookie (por defecto: _SESS).
    • id: el identificador de la sesión (por defecto: null).
    • cookie_lifetime: el tiempo que debe transcurrir para que una cookie se declare obsoleta.
    • path: la ruta de la cookie.
    • domain: el dominio al que pertenece la cookie.
    • secure: indica si se genera un cookie segura (HTTPS).
    • httponly: indica si la cookie sólo debe estar disponible para el protocolo HTTP.

    Todas esta opciones de configuración son opcionales. Las sesiones por defecto permanecen activas mientras la ventana del navegador esté abierta. Para modificar este comportamiento, modifica el valor de la opción lifetime.

  • session.test: indica si se deben simular las sesiones o no (esta opción sólo se utiliza para los tests funcionales).

A.10.2. Servicios proporcionados

El proveedor proporciona los siguientes servicios:

  • session: una instancia de la clase Session de Symfony2.
  • session.storage: este es el servicio que se utilizar para guardar información de forma persistente.
  • session.storage.handler: es el servicio que utiliza session.storage para acceder a la información. Por defecto se utiliza la clase NativeFileSessionHandler.

A.10.3. Cómo se registra el proveedor

El siguiente código muestra un ejemplo de cómo registrar este proveedor:

$app->register(new Silex\Provider\SessionServiceProvider());

A.10.4. Ejemplos de uso

El siguiente ejemplo muestra cómo utilizar el servicio session para autenticar a un usuario y crear una sesión para el:

use Symfony\Component\HttpFoundation\Response;
 
$app->get('/login', function () use ($app) {
    $username = $app['request']->server->get('PHP_AUTH_USER', false);
    $password = $app['request']->server->get('PHP_AUTH_PW');
 
    if ('igor' === $username && 'password' === $password) {
        $app['session']->set('user', array('username' => $username));
        return $app->redirect('/account');
    }
 
    $response = new Response();
    $response->headers->set('WWW-Authenticate', sprintf('Basic realm="%s"', 'site_login'));
    $response->setStatusCode(401, 'Please sign in.');
    return $response;
});
 
$app->get('/account', function () use ($app) {
    if (null === $user = $app['session']->get('user')) {
        return $app->redirect('/login');
    }
 
    return "Welcome {$user['username']}!";
});

A.10.4.1. Configuración propia de las sesiones

Si tu servidor utiliza una configuración propia para las sesiones (por ejemplo mediante Redis a través de una extensión PHP) tienes que establecer la opción session.storage.handler a null para la clase NativeFileSessionHandler. Además tendrás que configurar el valor de la opción session.save_path en el archivo php.ini de configuración de PHP.

$app['session.storage.handler'] = null;