De manera predeterminada, el SessionServiceProvider escribe en archivos la información de sesión utilizando el NativeFileSessionStorage de Symfony2. La mayoría de los medianos a grandes sitios web, utiliza una base de datos para almacenar sesiones en lugar de archivos, porque las bases de datos son más fáciles de usar y escalar en un entorno multiservidor.
El NativeSessionStorage de Symfony2 tiene controladores para el almacenamiento múltiple y uno de ellos utiliza PDO para almacenar sesiones, PdoSessionHandler. Para usarla, reemplaza en tu aplicación el servicio session.storage.handler como se explica a continuación.
use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler;
$app->register(new Silex\Provider\SessionServiceProvider());
$app['pdo.dsn'] = 'mysql:dbname=mydatabase';
$app['pdo.user'] = 'myuser';
$app['pdo.password'] = 'mypassword';
$app['session.db_options'] = array(
'db_table' => 'session',
'db_id_col' => 'session_id',
'db_data_col' => 'session_value',
'db_time_col' => 'session_time',
);
$app['pdo'] = $app->share(function () use ($app) {
return new PDO(
$app['pdo.dsn'],
$app['pdo.user'],
$app['pdo.password']
);
});
$app['session.storage.handler'] = $app->share(function () use ($app) {
return new PdoSessionHandler(
$app['pdo'],
$app['session.db_options'],
$app['session.storage.options']
);
});
Cuándo utilizas el DoctrineServiceProvider no tienes que hacer otra conexión a la base de datos, sencillamente pasa el método getWrappedConnection.
use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler;
$app->register(new Silex\Provider\SessionServiceProvider());
$app['session.db_options'] = array(
'db_table' => 'session',
'db_id_col' => 'session_id',
'db_data_col' => 'session_value',
'db_time_col' => 'session_time',
);
$app['session.storage.handler'] = $app->share(function () use ($app) {
return new PdoSessionHandler(
$app['db']->getWrappedConnection(),
$app['session.db_options'],
$app['session.storage.options']
);
});
PdoSessionStorage necesita una tabla en la base de datos con 3 columnas:
Puedes encontrar ejemplos de declaraciones SQL para crear la tabla de sesión en el Recetario de Symfony2.