在用户的会话中存储Doctrine记录

时间:2011-05-28 00:16:15

标签: php session symfony1 doctrine

所以我有一个插件可以根据用户的ID为我生成信息。

这在插件的模块'pitch'中发生:

public function executeIndex(sfWebRequest $request)
{
  $unique_id = $request->getParameter('unique_id');
  $this->user = UserTable::getInstance()->getByToken($unique_id);
  $this->forward404Unless($this->user);
  $this->iplocation=new IPLocation();

  $qualified_offers = new QualifiedOffers();
  $this->creatives = $qualified_offers->applicableTo($this->user);
  $this->match_type = UserDemoTable::getInstance()->getValue($this->user->id, 'match');

  // Put the applicable creatives into the session for later use
  $userCreatives = $this->creatives;
  $this->getUser()->setAttribute('userCreatives', $userCreatives);
}

然后我尝试在后续模板上调用该属性(在另一个名为'home'的模块中使用不同的操作):

public function executePage(sfWebRequest $request)
{
  $template = $this->findTemplate($request->getParameter('view'), $this->getUser()->getCulture());
  $this->forward404Unless($template);
  $this->setTemplate($template);
  // Grab the creatives applicable to the user
  $userCreatives = $this->getUser()->getAttribute( 'userCreatives' );
}

不幸的是它根本不起作用。

如果我从最初生成$ creatives的操作中尝试此操作:

$this->getUser()->setAttribute('userCreatives', $userCreatives);
$foo = $this->getUser()->getAttribute('userCreatives');
// Yee haw
print_r($foo);

我获得了巨大的成功。我基本上是这样做的,只有两个不同的控制器。鉴于我已将'userCreatives'添加到用户的会话中,这不应该是无关紧要的吗?

1 个答案:

答案 0 :(得分:4)

听起来你正试图将对象存储为用户属性(即在会话中)。

来自Jobeet Day 13

  

您可以在用户会话中存储对象,但强烈建议您不要这样做。这是因为会话对象在请求之间被序列化。当反序列化会话时,必须已经加载了存储对象的类,并且情况并非总是如此。此外,如果存储Propel或Doctrine对象,可能会出现“停滞”的对象。

尝试存储对象的arraystdClass表示形式,然后在检索对象后将其加载回“完整”对象。

以下是我在另一个项目中使用的示例:

class myUser extends sfGuardSecurityUser
{
  ...

  public function setAttribute( $name, $var )
  {
    if( $var instanceof Doctrine_Record )
    {
      $var = array(
          '__class'  => get_class($var),
          '__fields' => $var->toArray(true)
      );
    }

    return parent::setAttribute($name, $var);
  }

  public function getAttribute( $name, $default )
  {
    $val = parent::getAttribute($name, $default);

    if( is_array($val) and isset($val['__class'], $val['__fields']) )
    {
      $class  = $val['__class'];
      $fields = $val['__fields'];

      $val = new $class();
      $val->fromArray($fields, true)
    }

    return $val;
  }

  ...
}