开发者

Storing Doctrine records in the user's session

So I've got a plugin which produces information for me based on a user's id.

This happens in the plugin's module '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);
}

And then I try to call that attribute on the subsequent template (In a different module called 'home' with a different action):

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' );
}

Unfortunately it doesn't work at all.

If I try this from the action where $creatives is initially generated:

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

I am met with great success. I'm essentially doing开发者_运维技巧 this, only from two different controllers. Shouldn't that be irrelevant, given that I've added 'userCreatives' to the user's session?


It sounds like you're trying to store objects as user attributes (i.e., in the session).

From Jobeet Day 13:

You can store objects in the user session, but it is strongly discouraged. This is because the session object is serialized between requests. When the session is deserialized, the class of the stored objects must already be loaded, and that's not always the case. In addition, there can be "stalled" objects if you store Propel or Doctrine objects.

Try storing either array or stdClass representations of your objects and then loading them back into "full" objects once you retrieve them.

Here's an example that I used on another project:

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;
  }

  ...
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜