Прокси-методы не работают в sfGuardSecurityUser - PullRequest
0 голосов
/ 04 марта 2011

Я разрабатываю фильтр в Symfony для отслеживания определенного запроса, который пользователи выполняют в приложении.Чтобы получить текущего пользователя, я использую метод getContext():

$user = $this->getContext()->getUser();

И затем я пытаюсь получить доступ к его свойствам:

...
$username = $user->getUsername();
...

Проблема в том, что Symfony вызывает следующееисключение: вызов функции-члена getUsername () для необъекта в ... sfGuardSecurityUser.class.php , если я не получу пользователя таким образом:

$user = $this->getContext()->getUser()->getGuardUser();

Согласно Документация sfDoctrineGuardUser (и исходный код) существуют такие методы прокси:

public function getUsername()
{
    return $this->getGuardUser()->getUsername();
}

Почему метод прокси не работает?

ОБНОВЛЕНИЕ

После нескольких недель развития проблема снова возникла.На этот раз из представления с использованием переменной $sf_user.Я могу получить идентификатор с

$sf_user->getGuardUser()->getId()

, но не с

$sf_user->getId()

В моем собственном ответе ниже приводится объяснение.

Ответы [ 4 ]

1 голос
/ 04 марта 2011

Кажется, что $this->getGuardUser() возвращает ноль, вы должны выяснить, почему.

0 голосов
/ 22 июня 2012

Я нашел ошибку в версии sfGuardSecurityUser.class.php, которая у меня есть. Посмотрите вокруг строки 202 и измените это ... Это привело к тому, что оператор IF не сработал, поэтому НЕ возвращал пользователя при необходимости.

if (!$this->user && $id = $this->getAttribute('user_id', null, 'sfGuardSecurityUser'))
{

до

$id = $this->getAttribute('user_id', null, 'sfGuardSecurityUser');
if (!$this->user)
{
0 голосов
/ 13 апреля 2011

Просто добавьте ваши прокси-методы в ваш класс User, их не так много.

class myUser extends sfGuardSecurityUser
{
  public function getId()
  {
    return $this->getGuardUser()->getId();
  }
  public function getUsername()
  {
    return $this->getGuardUser()->getUsername();
  }
}

Или, если вам нравится магия, вы можете определить виртуальный метод __call () и перенаправить все неопределенные методы в родительский класс.

0 голосов
/ 13 апреля 2011

Благодаря комментарию @Matt Gibson я рассмотрел процесс установки sfDoctrineGuardPlugin. Кажется, я где-то сделал опечатку, потому что теперь все работает хорошо, оба

$this->getGuardUser()->getUsername()

и

$this->getUsername()

Тем не менее, я думаю, что эти прокси-методы могут быть улучшены, поскольку в них отсутствует метод getId. Вы можете получить почти все, кроме идентификатора, который необходимо получить, используя длинную форму:

$this->getGuardUser()->getId()
...