giorrrgio
giorrrgio

Reputation: 502

symfony 1.4 - inject current logged in user into Doctrine model

I would like to inject, with full testability, the id of the current logged in user into a creator_id field of a Doctrine_Record class, without using the sfContext singleton. I found a couple of Doctrine behaviours like http://www.symfony-project.org/plugins/sfDoctrineActAsSignablePlugin, but they access the sfContext singleton in a listener or (in another example I found) in the save method of a subclass of Doctrine_Record. I want to find a single entry point in the symfony controller, where I can inject the current logged in user and keep it till the end of the request. How do I do? Hope I have been clear enough.

EDIT: As @jeremy suggested, I made a custom filter:

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();
  }
}

So now my tests and my tasks are sfContext free, I just have to set the proper user Id at some point before starting the interactions with the db:

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

Upvotes: 1

Views: 1917

Answers (2)

Prasad
Prasad

Reputation: 1820

Thanks for raising this question. I wrote the http://www.symfony-project.org/plugins/sfAuditablePlugin with this in mind. I basically externalized the method that returns the userId so you can get the userId from session, doctrine parameter or wherever you have it. Here are the settings to configure the method that returns an array containing user_id and user_name

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

Upvotes: 0

Jeremy Kauffman
Jeremy Kauffman

Reputation: 10413

Great question! The use of sfContext everywhere is one of the uglier aspects of Symfony 1 and setting it on Doctrine_Manager sounds like a solid idea.

It's probably best to do this either in the configureDoctrine callback that happens in ProjectConfiguration (see below). I'm not 100% a user is present at this point, if it's not, your best bet is a custom filter (reference).

public function configureDoctrine(Doctrine_Manager $manager)
{
  $manager->setParam('user_id', sfContext::getInstance()->getUser()->getGuardUser()->getId());
}

Upvotes: 1

Related Questions