2013-07-05 5 views
1

У меня есть провайдер Entity (это репозиторий объектов, который выполняет поиск и дает мне пользователя при аутентификации), как это entity provider (MyBundle: Employee реализует UserInterface, так что это нормально)Как установить текущий аутентифицированный пользователь в качестве ссылки в объекте

class EmployeeRepository extends EntityRepository implements UserProviderInterface 
{ 
    public function loadUserByUsername($username) 
    { 
     $user = $this->getEntityManager() 
     ->createQuery("SELECT e FROM MyBundle:Employee e ...") 
     ->setParameters(...)->getOneOrNullResult(); 
     if ($user) { 
      return $user; 
     } 

     throw new UsernameNotFoundException(); 
    } 

    public function refreshUser(UserInterface $user) 
    { 
     ... 

     return $this->find($user->getId()); 
    } 
} 

и у меня есть еще один объект, как

class Task { 
    ... 

    /** 
    * @ManyToOne(targetEntity="Employee") 
    * @JoinColumn() 
    */ 
    protected $creator; 

    ... + setters/getters 
} 

так где-то в контроллере у меня есть:

$task = new Task(); 
$task->setCreator($this->getUser()) // or $this->get('security.context')->getToken()->getUser(); 
$em->persist($task); 
$em->flush(); 

и у меня есть исключение «Новый объект был найден через связь« ... \ Entity \ Task # creator », которая не была настроена на каскадное сохранение операций для объекта: ... \ Entity \ Employee @ 0000000066a194ca0000000038e61044. Для того, чтобы решить эту проблему: либо явный вызов EntityManager # сохраняется() на этой неизвестной сущности или настройка каскад сохраняется»

, но как это может быть: unpersisted лица было дано entityRepository ??? (если сохраняется GetUser() эм пытается для добавления нового сотрудника) Как установить создателя задачи?

ответ

1

Я нашел решение.

в этом коде я использовал новый экземпляр менеджера сущностей, как $ this-> Get («») doctrine.orm.entity_manager

$task = new Task(); 
$task->setCreator($this->getUser()) 
$em->persist($task); 
$em->flush(); 

, поэтому новый менеджер объект ничего не знает о таких организациях, как пользователь

и решение было использовать по умолчанию диспетчер объектов

$em = $this->get('doctrine.orm.default_entity_manager'); 
... 
$em->persist(task); 
$em->flush(); 

работает отлично.

0

Я не вижу код, но если вы хотите вставить новую задачу и нового пользователя в одно и то же время (используя тип коллекции в формах), вам нужно определить его в вашей организации (каскадная аннотация):

class Task { 
    ... 

    /** 
    * @ManyToOne(targetEntity="Employee", cascade={"persist"}) 
    * @JoinColumn() 
    */ 
    protected $creator; 

    ... + setters/getters 
} 


Для получения дополнительной информации о каскадных операций см Doctrine документации: http://docs.doctrine-project.org/en/2.0.x/reference/working-with-associations.html#transitive-persistence-cascade-operations

+0

Мне не нужно вставлять новых пользователей. Я хочу установить текущий аутентифицированный пользователь – jhard

+0

вы пытались запустить код с установкой cascade persist – phpsherpa

+0

да, я написал (последняя строка вопроса (нет каскада в аннотации, но смысл тот же)) – jhard

1

Как я понимаю, вы хотите, чтобы иметь возможность присоединиться к сущности Employee на сущности задач для того, чтобы знать, какой пользователь создал задачу.

Если да, то вам следует, вероятно, взглянуть на StofDoctrineExtensionBundle, что позволит вам легко использовать DoctrineExtension в Symfony2.

DoctrineExtension обеспечивает blameable behavior:

наказуемого поведение позволит автоматизировать обновление имени пользователя или ссылочный пользователя полей на ваши лицах или документах. Он работает через аннотации и может обновлять поля при создании, обновлении или даже при изменении значения определенного свойства.

namespace Entity; 

use Gedmo\Mapping\Annotation as Gedmo; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
*/ 
class Article 
{ 
    // ... 

    /** 
    * @var string $createdBy 
    * 
    * @Gedmo\Blameable(on="create") 
    * @ORM\Column(type="string") 
    */ 
    private $createdBy; 

    /** 
    * @var string $updatedBy 
    * 
    * @Gedmo\Blameable(on="update") 
    * @ORM\Column(type="string") 
    */ 
    private $updatedBy; 

    // ... 

    public function getCreated() 
    { 
     return $this->created; 
    } 

    public function getUpdated() 
    { 
     return $this->updated; 
    } 
} 

Надеется, что это помогает

+0

Это похоже на хорошее решение, но я я смотрю, как это сделать с помощью собственных функций – jhard

Смежные вопросы