2011-10-07 13 views
2

symfonyのセッション値の処理に問題があります。symfonyのセッション値が失われました

基本的には、問題はこれです。モジュールの値と実行されたアクションを取り込んでセッションスーパーグローバルに格納するアクションフィルタを有効にしました。

は、これは私のフィルタのコードです:

< ------ BEGIN CODE ---------------->

class getPrevModuleActionFilter extends sfFilter 
{ 
    public function execute ($filterChain) 
    { 
    //---------------Code to execute *BEFORE THE ACTION* execution---------------  
    if ($this->isFirstCall()) # Execute this filter only once 
    { 
     // Filters don't have direct access to request & user objects => Use context object to get them 
     $request = $this->getContext()->getRequest(); 
     $user = $this->getContext()->getUser(); 

     if($request->getParameter('action') !== "setCulture") 
     {   
     $_SESSION['prev_module'] = "M=".$request->getParameter('module'); 
     $_SESSION['prev_action'] = "A=".$request->getParameter('action'); 
     } 
    } 
    //---------------Execute next filter in the chain--------------- 
    $filterChain->execute(); 

    //---------------Code to execute *AFTER THE ACTION* execution, before the rendering--------------- 
    //(...) 

    } 
} 

< - ---- END CODE ---------------->

奇妙なことは、前のWebコントローラのprint_rを最後の分に実行すると:

    セッション中の値を次のSymfony店舗:

    をアクション「setCulture」が実行されます場合はありませんアクション「setCultureは」すべては(それが必要として、すなわち、セッションは前のモジュールとアクションを取得します)だけでなく

  1. を行く

    Array ( 
        [prev_module] => M= 
        [prev_action] => A=  
        (etc) 
    ) 
    

    つまり、2つのエントリのセッションの値が失われます。

私は別の名前空間を使ってみましたが、sfUserからsymfonyのsetAttributeを使ってセッション値を処理しようとしました。最後に、PHPの生のセッション処理を試みました。どうやら、セッション値のユーザーと記憶域に関連する工場のシャットダウンメソッドがセッション値を混乱させるようです!

私はあなたの助けが必要です。

SPECS:

  • symfonyのバージョン:1.4.6
  • PHP:5.3
  • 私はfrontend_dev.phpコントローラ
でコードを実行しているsymfonyのキャッシュ無効
  • を持っています
  • +0

    私はあなたを正しく理解していますが、prev_moduleを設定する場所と、setCultureが実行されていない場合はprev_actionはどこですか? –

    +0

    こんにちはTamas :)実際には、実行される最初のアクションはsetCulture(ホーム/インデックス)ではないので、prev_muduleとprev_actionがそれぞれの値を取得していることは間違いありません。その後、私はsetCultureアクションを要求し、何も実行されません....しかし、SESSIONの値は失われます!何か案は? (ありがとう) –

    +1

    私のテストから、この配列がフィルタ領域でアクセスされている場合、symfonyがSESSIONスーパーグローバルを混乱させることは間違いありません。アクションでアクセスされた場合、SESSION値が失われることなく、まったく同じコードが円滑に実行されます。奇妙な!私はほとんどすべてを試しました。sfSessionStorage.class.phpを調べて、どこからSESSIONの値が失われるのかを調べました。もう1つのことは、そのコードがフィルタで実行されているときに、私はサーバ上のsymfony用のPHPスクリプトのセッションをチェックし、それらの変数は値を失いましたが、実際にセッション中です!うーん、私は迷っている! –

    答えて

    0

    まあ、私はSymfonyがフィルタで使用されたときにセッションとクッキーを混乱させると思います。

    私は、アプリケーション全体のアクションを実行する独自のフィルタメカニズムを作成しました。

    ので、明確にするために、私の選択は:

    1. は、各モジュールのアクションにpreExecuteメソッドを追加する「fe_app_init」
    2. という静的メソッドを持っているルートのlibフォルダに自動的にロードするクラスを作成しますそのクラスのfe_app_initを使用するFEアプリケーションで

    これで、fe_app_init()はSESSIONの値を正当に処理します。

    Symfony 1は残念です。4にはフィルターなどのツールがありますが、その中でSESSIONとCOOKIESの処理が混乱します。

    関連する問題