2011-10-07 131 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,我会看到:

  1. 当这不是一个行动“setCulture”一切顺利的话(即会话中取得前一个模块和行动,因为它应该)

  2. 在行动“setCulture”被执行:在会议之后的Symfony专卖店值:

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

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

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

我需要你的帮助。

规格:

  • Symfony的版本:1.4.6
  • PHP:5.3
  • 我已经Symfony的缓存禁用
  • 我运行的代码与frontend_dev.php控制器
+0

不知道我是否正确理解你,但是在哪里设置了prev_module,并且prev_action是否执行了setCulture? –

+0

你好Tamas :)其实,第一个行动是不是setCulture(这是家/索引),所以我很确定prev_mudule和prev_action得到它们各自的值。然后我请求setCulture动作并且没有执行任何操作....但是SESSION的值会丢失!有任何想法吗? (谢谢) –

+1

我现在很确定,从我的测试中,如果在过滤器区域访问这个数组,symfony会混淆SESSION超全局。如果在动作中进行访问,则完全相同的代码可以平稳运行,而不会丢失SESSION值。奇怪的!我尝试了几乎所有的东西,甚至在sfSessionStorage.class.php中查找以找到它从SESSION中丢失的值。另一件事,当代码在过滤器中运行时,我在服务器上检查了会话中的symfony的php脚本,并且这些变量失去了它们的值,但实际上是在会话中!嗯......我迷路了! –

回答

0

那么,我猜Symfony在过滤器中使用SESSION和COOKIES时会出现混乱。

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

因此,要澄清,我的选择是:

  1. 创建根lib文件夹中自动加载一个类,有一个名为“fe_app_init”
  2. 添加preExecute方法,每个模块的动作静态方法在FE应用程序中使用该类别的fe_app_init

现在,fe_app_init()正确处理SESSION中的值。

Symfony 1这是一个耻辱。4有一个工具,如过滤器,但随后弄糟SESSION和COOKIES处理。