Ицньютон указал мне на решение.Класс sfGuardSecurityUser использует метод setReferer, который сохраняет атрибут referer, но только если он еще не установлен.
Если каким-то образом вам удастся дважды получить доступ к методу executeSignin в действиях sfGuard, будет сохранен только первый атрибут referer.это означает, что во второй раз referer в запросе и referer в пользовательском атрибуте могут отличаться.
Метод getReferer удаляет этот атрибут и возвращается к запросному рефереру, когда атрибут не установлен.это объясняет, почему при вызове $ user-> getReferer ($ request-> getReferer ()) дважды иногда возвращаются разные значения.
Я нашел решение переписать метод setReferer sfGuardSecurityUser в классе myUser:
public function setReferer($referer) {
$this->setAttribute('referer', $referer);
}
Пока что я не нашел никаких побочных эффектов, это изменение гарантирует, что пользовательский атрибут всегда будет самым последним, однако должна быть причина, чтобы объяснить, почему люди Symfony решили реализовать это так, как было.
Я проверил это, переключаясь между приложениями на экране входа в систему, позволяя сеансу умереть, убивая сеанс вручную и обычно используя приложение, и пока я не обнаружил никаких побочных эффектов.