2012-03-16 9 views
13

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

+2

Por favor intente agregar esto en la parte superior: '$ app-> before (function ($ request) {$ request-> getSession() -> start();});' – igorw

+0

@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

+0

Permítanme volver a publicar esto como una respuesta en ese momento. – igorw

Respuesta

26

En este momento es necesario iniciar la sesión de forma manual:

$app->before(function ($request) { 
    $request->getSession()->start(); 
}); 

Hay entradas acerca de esto en el rastreador de silex, no he tenido tiempo de pensar en ello todavía. El problema es que si haces esto, harás una sesión para cada usuario. Cada vez que use una sesión, significa que cada usuario obtiene cookies. Que es algo que quizás no quieras. Esa es la razón por la cual no se inicia automáticamente en este punto.

Espero que aclare un poco las cosas.

+0

En mi escenario, usar una sesión para cada usuario es aceptable, así que no me importa. Gracias de nuevo, tanto por la respuesta como por la aclaración. – dbrumann

+5

¡Por favor, agregue esto a los documentos de Silex! Acabo de pasar una hora recorriendo el código de la sesión de Symfony tratando de resolver esto. – yitznewton

+0

@igorw, silex sigue afectado por este problema? – Federkun

Cuestiones relacionadas