Php 将条令记录存储在用户';会议

Php 将条令记录存储在用户';会议,php,session,symfony1,doctrine,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->forward404Unle

所以我有一个插件,它根据用户的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”的模块中,使用不同的操作):

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

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

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

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

听起来好像您正试图将对象存储为用户属性(即,在会话中)

发件人:

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

尝试存储对象的
array
stdClass
表示,然后在检索到它们后将它们加载回“完整”对象

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

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

  ...
}

听起来好像您正试图将对象存储为用户属性(即,在会话中)

发件人:

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

尝试存储对象的
array
stdClass
表示,然后在检索到它们后将它们加载回“完整”对象

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

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

  ...
}

它应该会起作用。你是在调用$this->getUser()->getAttributeHold()->clear()吗?@Tom整个应用程序中都没有调用它。嗯。。。我会检查以确保setAttribute()肯定会在getAttribute()之前被调用,并且我还会尝试传递一个简单的变量进行测试。看起来您正在传递数组,尽管它无论如何应该可以工作。Var_转储getAttributeHolder还将显示存储的确切内容。@Tom也许我弄错了-但是该属性是否应作为$userCreatives提供给视图?该变量var_在模板中转储为null。是因为我试图不正确地使用它吗?@Tom有趣的是,我已经到了可以从页面操作(我正在使用的视图的控制器)中var_dump$userCreatives的程度,并且内容是正确的,但是在视图中,变量显然是未定义的。有什么想法吗?应该行得通。你是在调用$this->getUser()->getAttributeHold()->clear()吗?@Tom整个应用程序中都没有调用它。嗯。。。我会检查以确保setAttribute()肯定会在getAttribute()之前被调用,并且我还会尝试传递一个简单的变量进行测试。看起来您正在传递数组,尽管它无论如何应该可以工作。Var_转储getAttributeHolder还将显示存储的确切内容。@Tom也许我弄错了-但是该属性是否应作为$userCreatives提供给视图?该变量var_在模板中转储为null。是因为我试图不正确地使用它吗?@Tom有趣的是,我已经到了可以从页面操作(我正在使用的视图的控制器)中var_dump$userCreatives的程度,并且内容是正确的,但是在视图中,变量显然是未定义的。有什么想法吗?