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 claseNativeFileSessionHandler
. Su valor por defecto es igual al valor devuelto por la funciónsys_get_temp_dir()
.session.storage.options
: array de opciones que se pasa al constructor del serviciosession.storage
. Cuando se utiliza la claseNativeSessionStorage
, 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 utilizasession.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;