Хранение записей Doctrine в сеансе пользователя - PullRequest
0 голосов
/ 28 мая 2011

Итак, у меня есть плагин, который производит информацию для меня на основе идентификатора пользователя.

Это происходит в модуле плагина '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 Ответ

4 голосов
/ 10 августа 2011

Похоже, вы пытаетесь сохранить объекты как пользовательские атрибуты (т.е. в сеансе).

С Jobeet Day 13 :

Вы можете хранить объекты в сеансе пользователя, но это настоятельно не рекомендуется. Это потому, что объект сеанса сериализуется между запросами. Когда сеанс десериализуется, класс хранимых объектов уже должен быть загружен, и это не всегда так. Кроме того, объекты «Propel» или «Doctrine» могут быть «застопорены».

Попробуйте сохранить либо 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;
  }

  ...
}
...