PrePersit 当前用户
PrePersit current user
[设置]
- Symfony 3.4
- 登录用户 (FosUserBundle)
Projet
实体(下)
src/AppBundle/Entity/Projet.php
class Projet {
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="titre", type="string", length=50)
*/
private $titre;
/**
* @var \DateTime
*
* @ORM\Column(name="creation", type="datetime")
*/
private $creation;
/**
* @var \DateTime
*
* @ORM\Column(name="modification", type="datetime")
*/
private $modification;
/**
* @var
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="projet")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function updatedTimestamps() {
$this->setModification(new \DateTime());
if($this->getCreation() == null) {
$this->setCreation(new \DateTime());
$this->setSupprime(false);
}
}
}
[问题]
照原样,我在 PrePersit
/PreUpdate
上设置 creation
和 modification
。
我也想设置当前登录用户的id,我该怎么做?
我认为您必须在订阅者中执行此操作,监听 prepersist 和 preupdate 学说事件。
您将能够通过注入 security.token_storage 服务
来获取当前用户
为此,您需要有权访问 security.token_storage
服务并调用 $tokenStorage->getToken()->getUser()
来检索当前用户。由于不建议将服务注入实体,因此您应该按照 this section of the doctrine documentation.
中的描述创建实体侦听器
然后,通过将您的实体侦听器声明为服务并将 security.token_storage
添加到其构造函数参数中,如下所示(在您的 services.yml
中):
listener.projet:
class: AppBundle\Listener\ProjetListener
arguments: [ "@security.token_storage" ]
tags:
- { name: doctrine.orm.entity_listener, lazy: true }
您将能够在 prePersist
和 preUpdate
方法中访问当前登录的用户。
编辑:你的听众应该是这样的
AppBundle/Listener/ProjetListener.php
namespace AppBundle\Listener;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use AppBundle\Entity\Projet;
class ProjetListener
{
private $tokenStorage;
public function __construct(TokenStorage $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
public function prePersist(Projet $projet, LifecycleEventArgs $args)
{
// Assigning the current user to the Projet instance being persisted
$projet->setUser($this->tokenStorage->getToken()->getUser());
/* .. other actions of prePersist .. */
}
public function preUpdate(Projet $projet, PreUpdateEventArgs $args)
{
/* .. actions of preUpdate .. */
}
}
[设置]
- Symfony 3.4
- 登录用户 (FosUserBundle)
Projet
实体(下)
src/AppBundle/Entity/Projet.php
class Projet {
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="titre", type="string", length=50)
*/
private $titre;
/**
* @var \DateTime
*
* @ORM\Column(name="creation", type="datetime")
*/
private $creation;
/**
* @var \DateTime
*
* @ORM\Column(name="modification", type="datetime")
*/
private $modification;
/**
* @var
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="projet")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function updatedTimestamps() {
$this->setModification(new \DateTime());
if($this->getCreation() == null) {
$this->setCreation(new \DateTime());
$this->setSupprime(false);
}
}
}
[问题]
照原样,我在 PrePersit
/PreUpdate
上设置 creation
和 modification
。
我也想设置当前登录用户的id,我该怎么做?
我认为您必须在订阅者中执行此操作,监听 prepersist 和 preupdate 学说事件。 您将能够通过注入 security.token_storage 服务
来获取当前用户为此,您需要有权访问 security.token_storage
服务并调用 $tokenStorage->getToken()->getUser()
来检索当前用户。由于不建议将服务注入实体,因此您应该按照 this section of the doctrine documentation.
然后,通过将您的实体侦听器声明为服务并将 security.token_storage
添加到其构造函数参数中,如下所示(在您的 services.yml
中):
listener.projet:
class: AppBundle\Listener\ProjetListener
arguments: [ "@security.token_storage" ]
tags:
- { name: doctrine.orm.entity_listener, lazy: true }
您将能够在 prePersist
和 preUpdate
方法中访问当前登录的用户。
编辑:你的听众应该是这样的
AppBundle/Listener/ProjetListener.php
namespace AppBundle\Listener;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use AppBundle\Entity\Projet;
class ProjetListener
{
private $tokenStorage;
public function __construct(TokenStorage $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
public function prePersist(Projet $projet, LifecycleEventArgs $args)
{
// Assigning the current user to the Projet instance being persisted
$projet->setUser($this->tokenStorage->getToken()->getUser());
/* .. other actions of prePersist .. */
}
public function preUpdate(Projet $projet, PreUpdateEventArgs $args)
{
/* .. actions of preUpdate .. */
}
}