2012-03-16 11 views
13

何らかの理由でセッションがSilex-appで動作しません。私はphp.iniのerror_reportingをE_ALL | E_STRICTに設定し、エラーを表示してログに記録します。そこには何も見えません。しかし何らかの理由でセッションが作成されず、/project-root/tmp/sessions/にファイルがありません(また、デフォルトのsession.save_pathを使用している場合もありません)。ファイルシステムの読み取り/書き込み許可の問題を排除するために、PdoSessionStorageに切り替えると結果も得られませんでした。私も$app['session']$request->getSession()$app['request']->getSession()の間で切り替えることを試みました。セッションはSilex Appで動作しません

私は問題を探すために他にどこまでのように途方に暮れています...ここで

は、私が書いた非常に簡単なテストアプリ(useは、スペースを節約するために省略されている)です。基本的にこのテストでは、私の実際のアプリで何を達成しようとしているのかを示しています。セッションに配列を格納したい。 $app->before()で値が設定されているかどうかを確認し、それを表示するために小枝に渡します。ログイン情報:You are logged in as {{ user.name }}:/ Nothingに行くが表示されたら

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

、へ/テストを行くのみ "を取得::テストは、" 表示されます(ただしれません

$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は次のようになります実際には、以前にトリガーに戻ったり、トリガーをリフレッシュしたりすることはありません。

+2

これを上に追加してみてください: '$ app-> before(function($ request){$ request-> getSession() - > start();});' – igorw

+0

@igorw 。木の木を見なかったのだろう。私はZend Frameworkで作業しているシーンの裏側でセッションを開始することに慣れています。手動で起動することさえ考えていませんでした。 – dbrumann

+0

答えとして再投稿しましょう。 – igorw

答えて

26

今、あなたは手動でセッションを開始する必要があります。

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

は、この程度のチケットは、サイレックス・トラッカーであり、私はまだそれについて考える時間がありませんでした。問題は、これを行うと、すべてのユーザーに対してセッションを作成するということです。セッションを使用するたびに、すべてのユーザーがCookieを取得することを意味します。あなたが望んでいないかもしれないものです。この時点で自動的に開始されないのはこのためです。

少しクリアすることを願っています。

+0

私のシナリオでは、各ユーザーのセッションを使用することは許容されるので、気にしません。答えと説明の両方に感謝します。 – dbrumann

+5

これをSilexのドキュメントに追加してください!私はこれを理解しようとしているSymfonyセッションコードを使って1時間の時間を過ごしました。 – yitznewton

+0

@igorw、silexはまだこの問題の影響を受けていますか? – Federkun

関連する問題