symfony 1.4 - вводит текущего зарегистрированного пользователя в модель Doctrine - PullRequest
1 голос
/ 23 мая 2011

Я бы хотел с полной проверяемостью ввести идентификатор текущего пользователя, вошедшего в систему, в поле creator_id класса Doctrine_Record без использования синглтона sfContext.Я обнаружил несколько вариантов поведения Doctrine, таких как http://www.symfony -project.org / plugins / sfDoctrineActAsSignablePlugin , но они обращаются к синглтону sfContext в слушателе или (в другом найденном мной примере) в методе сохранения подклассаDoctrine_Record.Я хочу найти единственную точку входа в контроллере Symfony, где я могу ввести текущего вошедшего в систему пользователя и сохранить его до конца запроса.Как мне это сделать?Надеюсь, я был достаточно ясен.

РЕДАКТИРОВАТЬ: Как @jeremy предложил, я сделал пользовательский фильтр:

class userFilter extends sfFilter
{
  public function execute($filterChain)
  {
    $user = $this->getContext()->getUser();
    if ($user->isAuthenticated()) {
      $guard = $user->getGuardUser();
      Doctrine_Manager::getInstance()->setAttribute('logged_in_user', $guard->getId());
    }

    // Execute next filter
    $filterChain->execute();
  }
}

Так что теперь мои тесты и мои задачи свободны от sfContext, мне просто нужноустановить правильный идентификатор пользователя в какой-то момент перед началом взаимодействия с БД:

Doctrine_Manager::getInstance()->setAttribute('logged_in_user', sfConfig::get('default_user'));

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Отличный вопрос!Повсеместное использование sfContext является одним из самых уродливых аспектов Symfony 1, и установка его на Doctrine_Manager звучит как серьезная идея.

Вероятно, лучше сделать это либо в обратном вызове configureDoctrine, который происходит в ProjectConfiguration (см. Ниже).Я не на 100%, если пользователь присутствует на данном этапе, в противном случае лучше всего будет использовать пользовательский фильтр ( ссылка ).

public function configureDoctrine(Doctrine_Manager $manager)
{
  $manager->setParam('user_id', sfContext::getInstance()->getUser()->getGuardUser()->getId());
}
0 голосов
/ 27 мая 2011

Спасибо, что подняли этот вопрос.Я написал http://www.symfony -project.org / plugins / sfAuditablePlugin с учетом этого.Я в основном экстернализировал метод, который возвращает userId, чтобы вы могли получить userId из сеанса, параметра doctrine или везде, где он у вас есть.Вот настройки для настройки метода, который возвращает массив, содержащий user_id и user_name

  # Retrieve User Array from custom implementation
      # [0] => (int)user_id; [1] => (string)user_name;
  getUserArray:
    class_name: Utility
    static_method_name: getUserAuditArray
...