2012-03-16 32 views
13

'da çalışmaz Sebep ne olursa olsun, Silex-app'ımda çalışmaz. Php.ini dosyasında error_reporting öğesini E_ALL | E_STRICT olarak ayarlıyorum ve hatalar görüntüleniyor ve günlüğe kaydediliyor. Orada görülecek bir şey yok. Ancak bazı nedenlerle hiçbir oturum oluşturulmaz ve /project-root/tmp/sessions/ (ve ayrıca varsayılan session.save_path kullanırken değil) dosya yok. PdoSessionStorage'a geçerek, dosya sistemindeki okuma/yazma izinleriyle ilgili sorunları ortadan kaldırmak için hiçbir sonuç alınmadı. Ayrıca $app['session'], $request->getSession() ve $app['request']->getSession() arasında geçiş yapmaya çalıştım.Oturumlar Silex App

Ben sorunları görmek için başka nerede olarak bir kayıp am ... İşte

yazdım çok basit bir test uygulaması (use yer kazanmak için atlanırsa) 'dir. Temel olarak bu test, gerçek uygulamamda elde etmeye çalıştığım şeyi gösterir. Bir diziyi oturumda saklamak istiyorum. $app->before()'da, değerin ayarlanıp ayarlanmadığını kontrol et ve sonra gösterilmek üzere dalma geçir, ör. giriş info: You are logged in as {{ user.name }}:

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

/hiçbir şey için/testi giderken sadece "get: testi" görüntülenir olacak:

$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 şöyle görüntülenir (ancak Aslında, ne daha önce/ne de tazelenen tetikleyicilere geri dönüş olarak saklanır.

+2

Lütfen bunu en üste ekleyerek deneyin: '$ app-> before (işlev ($ request) {$ request-> getSession() -> start();});' – igorw

+0

@igorw Teşekkürler, bu hile yaptı . Ağaçlar için odun görmedim sanırım. Zend Framework ile çalışmaya başladığım sahnelerin arkasına çok alışkınım, elle başlatmayı bile düşünmedim, – dbrumann

+0

Bunu bir cevap olarak tekrar yayınlayayım. – igorw

cevap

26

Şu anda manuel oturumu başlatmak gerekir:

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

çakmaktaşı izleyicide bu konuda bilet yok henüz düşünmeye zamanım olmadı. Sorun şu ki, bunu yaparsanız, her kullanıcı için bir oturum yapacaksınız. Her oturumda bir kullanıcı, her kullanıcının çerez aldığı anlamına gelir. İstemeyeceğin bir şey. Bu noktada otomatik olarak başlatılmamasının nedeni de budur.

Umarım bu, bazı şeyleri temizler.

+0

Her kullanıcı için bir oturum kullanarak benim senaryoda kabul edilebilir, bu yüzden umurumda değil. Tekrar teşekkürler, hem cevap hem de açıklama için. – dbrumann

+5

Lütfen bunu Silex belgelerine ekleyin! Bunu anlamaya çalışırken Symfony Session kodundan bir saat geçirdim. – yitznewton

+0

@igorw, silex hala bu sorundan etkileniyor? – Federkun