2017-02-03 5 views
0

мне было интересно, если есть способ, что я могу инициализировать домовладелец с объектом Пользователем FOSUserBundle так, что она содержит пользователь, создавшее сообщениеSymfony 3 получить текущий пользователь внутри объекта

Я хочу, чтобы это сделать внутри конструктора, как показано ниже.

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Table(name="post") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\PostRepository") 
*/ 
class Post 
{ 
    /* here are defined some attributs */ 
    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="posts") 
    * @ORM\JoinColumn(name="owner", referencedColumnName="id") 
    */ 
    private $owner; 

    public function __construct() 
    { 
    $this->owner = /* get current user */ ; 
    } 

} 

Есть ли способ сделать это, заменив комментарий в конструкторе чем-нибудь?

Спасибо за ваши ответы

+0

Doctrine фактически не использует конструктор, так что нет. Почему бы просто не установить связь между почтой и пользователем? – Cerad

+1

отношение уже существует, когда создается новое сообщение, атрибуты владельца инициализируются подключенным в настоящее время пользователем – paris93

+0

. Итак, все, что вы хотите, это инициализировать владельца, когда сначала создается новый опубликованный? Если это так, оба приведенных ниже ответа действительны.Лично я пошел бы с фабричным подходом, возможно добавив метод create в почтовый репозиторий вместо автономного класса. Но все перечисленные подходы имеют смысл. – Cerad

ответ

3

Я думаю, что вы слишком усложняете эту проблему. Когда вы создаете новое сообщение в своем контроллере, либо в контроллере, либо в репозитории, сделайте что-то вроде этого:

use AppBundle\Entity\Post; //at top of controller 

$em = $this->getDoctrine()->getManager(); 
$user = $this->container->get('security.token_storage')->getToken()->getUser(); 
$post = new Post(); 
$em->persist($post); 
$post->setOwner($user); 
// set other fields in your post entity 
$em->flush(); 
4

Нет, нет. [*]

Есть по крайней мере два способа решения этой:

  • Создать Разместить свои объекты через службу фабрики, которая заполнит owner свойство:

    namespace My\Bundle\EntityFactory; 
    
    use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 
    use My\Bundle\Entity\Post; 
    
    class PostFactory 
    { 
        private $tokenStorage; 
    
        public function __construct(TokenStorageInterface $tokenStorage) 
        { 
         $this->tokenStorage = $tokenStorage; 
        } 
    
        public function createPost() 
        { 
         $user = $this->tokenStorage()->getToken()->getUser(); 
         $post = new Post($user); 
        } 
    } 
    

    (для в этом примере вам необходимо будет изменить свой конструктор Post до , примите владельца как параметр)

    В services.yml:

    services: 
        post_factory: 
         class: My\Bundle\EntityFactory\PostFactory 
         arguments: [@security.token_storage] 
    

    Чтобы создать объект из контроллера:

    $post = $this->container->get('post_factory')->createPost(); 
    
  • Если вы можете терпеть, что владелец будет установлен только один раз вы будете упорствовать в сущности, вам может использовать слушателя доктрина событий:

    namespace My\Bundle\EventListener; 
    
    use Doctrine\ORM\Event\LifecycleEventArgs; 
    use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 
    use My\Bundle\Entity\Post; 
    
    class PostOwnerAssignmentListener 
    { 
        private $tokenStorage; 
    
        public function __construct(TokenStorageInterface $tokenStorage) 
        { 
         $this->tokenStorage = $tokenStorage; 
        } 
    
        public function prePersist(LifecycleEventArgs $event) 
        { 
         $entity = $event->getEntity(); 
         if ($entity instanceof Post && !$entity->getOwner()) { 
          $entity->setOwner($this->tokenStorage->getToken()->getUser()); 
         } 
        } 
    } 
    

    В services.yml:

    services: 
        post_owner_assignment_listener: 
         class: My\Bundle\EventListener\PostOwnerAssignmentListener 
         arguments: [@security.token_storage] 
         tags: 
          - { name: doctrine.event_listener, event: prePersit } 
    

    Преимущество здесь состоит в том, что владелец не получает назначение независимо от того, как и где Post создается.

[*]: Ну, технически с по умолчанию app.php вы могли бы получить доступ к ядра, объявляя global $kernel; в конструкторе и идти оттуда, однако это очень настоятельно рекомендуется и может сломаться в странном и тонкие способов.

+0

его более полезным спасибо – ALWAN

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