Por alguna razón, las sesiones no funcionan en mi aplicación Silex. Establecí error_reporting en mi php.ini en E_ALL | E_STRICT
y los errores se muestran y registran. Nada que ver allí. Pero, por algún motivo, no se crea ninguna sesión y no hay ningún archivo en /project-root/tmp/sessions/
(y tampoco, cuando se utiliza la sesión por defecto save_path). Cambiar a PdoSessionStorage, para descartar problemas con los permisos de lectura/escritura en el sistema de archivos, tampoco produjo ningún resultado. También intenté cambiar entre $app['session']
, $request->getSession()
y $app['request']->getSession()
en vano.Las sesiones no funcionan en Silex App
Estoy en una pérdida en cuanto a dónde más buscar problemas ...
Aquí es una prueba muy sencilla aplicación que escribí (use
se omite para ahorrar espacio). Básicamente, esta prueba muestra lo que trato de lograr en mi aplicación real. Quiero almacenar una matriz en la sesión. En $app->before()
, compruebo si el valor está establecido y luego lo paso a ramita para que se muestre, p. Ej. Datos de entrada: You are logged in as {{ user.name }}
:
$app = new Application;
$app['debug'] = true;
$app->register(new SessionServiceProvider, array(
'session.storage.save_path' => dirname(__DIR__) . '/tmp/sessions'
));
$app->register(new TwigServiceProvider, array(
'twig.path' => __DIR__ . '/views'
));
$app->before(function (Request $request) use ($app) {
// if ($app['debug'] == true) {
// $request->getSession()->set('test', array('key' => 'value'));
// }
if ($request->hasPreviousSession() && $request->getSession()->has('test')) {
$test = $request->getSession()->get('test');
if ($test !== null) {
$app['twig']->addGlobal('before', $test);
}
}
});
$app->get('/', function() use ($app) {
return $app['twig']->render('sessiontest.twig');
});
$app->get('/test', function() use ($app) {
$app['session']->set('test', array('key' => 'value'));
return $app['twig']->render('sessiontest.twig',
array('get' => $app['session']->get('test')));
});
$app->run();
sessiontest.twig se ve así:
<html>
<head><title>test</title></head>
<body>
{% if before is defined %}before: {{ before.key }}{% endif %}
{% if get is defined %}get: {{ get.key }}{% endif %}
</body>
</html>
Cuando va a aparece/nada, cuando se va a/prueba sólo "obtener: Prueba" en la pantalla (pero no realmente almacenado, ya que ninguno regresa a/ni refresca disparadores antes).
Por favor intente agregar esto en la parte superior: '$ app-> before (function ($ request) {$ request-> getSession() -> start();});' – igorw
@igorw Gracias, eso funcionó . No vi la madera para los árboles, supongo. Estoy tan acostumbrado a que la sesión se inicie tras bastidores de trabajar con Zend Framework, que ni siquiera pensé en iniciarla manualmente, – dbrumann
Permítanme volver a publicar esto como una respuesta en ese momento. – igorw