2

我开始这篇文章是为了了解如何从用户会话(Symfony 1.4)中获取/设置值。Get 可以完美运行,但 Set 永远无法正常工作。我可以在调试模式中看到全局会话($_SESSION)已更新,但用户会话没有。我尝试了这种方式这种方式另一种方式,至少这个......没有成功。我从未从 Symfony 1.4 中读到过这样的错误。我使用浏览器(linux)Firefox和Chrome(我也将它测试到匿名标签中)。

调试方式用户看起来像:

attributeHolder:
myNS: { 
     aValue: '15', 
     ns_15: { 
         Tel: '78568951', 
         myID: '15', 
         anotherID: '120', 
         anArray: [{ 
             arrayID: '78', 
             Company: 'myComp'
         }] }, 
     ns_17: { ... } 
}

我可以更改aValue属性,删除并重新插入它。但是ns_15ns_17可以删除或更改,但此更改不能影响(symfony 调试模式)用户,但只需进入$_SESSION(symfony 调试模式全局)我可以看到更新的值。

是否有另一种方法可以使用 symfony 1.4 设置/更改/删除或将值写入用户会话,或者它是 Symfony 错误?

编辑1

直到我看到这个错误和这个博客,我才弄清楚!好吧,我正在使用 AJAX 来调用控制器。所以这可能是我不能在 Session 上写的原因。另一种我不能真正继承 sfWebResponse 的方式是因为我的操作已经是 sfActions 的子类。:(

编辑2

因为Edit1我试图做到这一点:

  $sessionData = $this->getUser()->getAttribute("ns_15", array(), "myNS");//all good
  $sessionData["Tel"] = "0111111110";
  var_dump($sessionData["Tel"]);//show me 0111111110
  $this->getUser()->setAttribute("ns_15", $sessionData, "myNS");
  $this->getUser()->shutdown();
  sfContext::getInstance()->getStorage()->shutdown();

解决了两次重新加载的行为,但仍然无法写入 $_SESSION 和 USER SESSION。(同样的麻烦)。

4

1 回答 1

0

我尝试总结如何操作用户属性(请注意,这与修改$_SESSION全局不同,请参阅我的评论了解原因)。

// set a singe value in a namespace
$this->getUser()->setAttribute('aValue', 15, 'myNS');
// set an array in a namespace
$this->getUser()->setAttribute('ns_15', array('Tel' => '78568951', 'myID' => '15', 'anotherID' => '120', 'anArray' => array(array('arrayID' => '78', 'Company' => 'myComp'))), 'myNS');

// get the array from a namespace
$attributes = $this->getUser()->getAttribute('ns_15', array(), 'myNS');
// modify some value in the array
$attributes['Tel'] = '12345';
// remove some value from the array
unset($attributes['myID']);
// ... and save your changes back
$this->getUser()->setAttribute('ns_15', $attributes, 'myNS');
// remove the whole array from the namespase
$this->getUser()->getAttributeHolder()->remove('ns_15', null, 'myNS');
// remove the whole namespace
$this->getUser()->getAttributeHolder()->removeNamespace('myNS');

您也可以访问整个命名空间:

// get all attributes from a namespace
$allAttributes = $this->getUser()->getAttributeHolder()->getAll('myNS');
// manipulate the whole namespace here...
// ...and save your changes back
$this->getUser()->getAttributeHolder()->add($allAttributes, 'myNS');

如果您在同一个命名空间上工作并且想要省略命名空间参数:

$originalDefaultNs = $this->getUser()->getAttributeHolder()->getDefaultNamespace();
$this->getUser()->getAttributeHolder()->setDefaultNamespace('myNS', false);
// ...
$attributes = $this->getUser()->getAttribute('ns_15', array());
// ...
// don't forget to set back the original ns
$this->getUser()->getAttributeHolder()->setDefaultNamespace($originalDefaultNS, false);

我知道这真的很冗长,但我认为在 symfony 中没有其他方法可以做到这一点。你可以在sfNamespacedParameterHolder课堂上抢购一下,看看这些功能是如何工作的。

于 2012-08-10T10:39:54.320 回答