Symfony会话值丢失

时间:2011-10-07 14:54:26

标签: php session caching symfony1 filter

我遇到了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,我会看到:

  1. 当一个不是'setCulture'的动作一切顺利时(即会话获得之前的模块和行动)

  2. 当执行'setCulture'操作时:Symfony会在会话中存储以下值:

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

    即,它会丢失这两个条目的会话值。

  3. 我尝试使用不同的命名空间,我尝试使用sfUser中的symfony的setAttribute来处理会话值。最后,我尝试了PHP的原始会话处理。显然,与用户和会话值存储相关的工厂的关闭方法似乎搞乱了会话值!

    我需要你的帮助。

    SPECS:

    • Symfony版本:1.4.6
    • PHP:5.3
    • 我禁用了Symfony的缓存
    • 我正在使用frontend_dev.php控制器运行代码

1 个答案:

答案 0 :(得分:0)

好吧,我猜Symfony在过滤器中使用时会混淆SESSION和COOKIES。

我最终创建了自己的过滤机制,为整个应用程序执行操作。

所以,澄清一下,我的选择是:

  1. 在root lib文件夹中创建一个自动加载的类,它有一个名为'fe_app_init'的静态方法
  2. 为使用该类中的fe_app_init的FE应用程序中的每个模块的操作添加preExecute方法
  3. 现在,fe_app_init()正确地处理了SESSION中的值。

    令人遗憾的是,Symfony 1.4有一个像过滤器这样的工具,但随后会混淆SESSION和COOKIES处理。