#php #session #symfony1 #doctrine
#php #сеанс #symfony1 #doctrine
Вопрос:
Итак, у меня есть плагин, который выдает информацию для меня на основе идентификатора пользователя.
Это происходит в модуле плагина ‘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. Это должно сработать. Вы случайно не вызываете $this-> getUser()-> getAttributeHolder()-> clear() где-то посередине?
2. @Tom Это нигде не вызывается во всем приложении.
3. Хм… Я бы проверил, чтобы убедиться, что setAttribute () обязательно вызывается перед getAttribute (), и я бы также попытался передать простую переменную для тестирования. Похоже, вы передаете array, хотя это все равно должно работать. Var_dumping для getAttributeHolder также покажет, что именно хранится.
4. @Tom Возможно, я ошибаюсь — Но должен ли атрибут быть доступен для просмотра как $userCreatives? Эта переменная var_dumps имеет значение null в шаблоне. Это из-за того, что я пытаюсь использовать его неправильно?
5. @Tom Интересно, что я дошел до того, что могу изменить значение $ userCreatives из действия страницы (контроллер представления, с которым я работаю), и содержимое правильное, но в представлении переменная, по-видимому, не определена. Есть идеи?
Ответ №1:
Звучит так, как будто вы пытаетесь сохранить объекты как пользовательские атрибуты (т. Е. в сеансе).
Из 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;
}
...
}