我为需要访问当前登录用户的 prePersist 和 preFlush 事件创建了一个监听器:
<?php
namespace App\EventListener;
use App\Entity\AbstractEntity;
use App\Entity\User;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs;
use Exception;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Syfony\Component\Security\Core\User\UserInterface;
use function is_object;
class DatabaseActivitySubscriber implements EventSubscriber
{
/**
* @var TokenInterface|null
*/
private ?TokenInterface $token;
public function __construct(TokenStorageInterface $tokenStorage)
{
$this->token = $tokenStorage->getToken();
}
/**
* @return array|string[]
*/
public function getSubscribedEvents()
{
return [
Events::prePersist,
Events::preUpdate,
];
}
/**
* Initialise le nom de l'utilisateur a l'origine de la création sous la forme "Nom Prénom (id)"
*
* @param LifecycleEventArgs $args
* @throws Exception
*/
public function prePersist(LifecycleEventArgs $args)
{
if ($args->getObject() instanceof AbstractEntity) {
$args->getObject()->setCreateUser($this->getUser()->getLastName() . ' ' . $this->getuser()->getLastName() . ' (' . $this->getuser()->getId() . ')');
}
}
/**
* @return string|\Stringable|UserInterface|null|User
*/
private function getUser()
{
if (null === $token = $this->token) {
return null;
}
if (!is_object($user = $token->getUser())) {
// e.g. anonymous authentication
return null;
}
return $user;
}
但令牌始终为空。
并且用户可以通过 $this->getUser(); 很好地检索到。紧接着,我的 dataBaseSubscriber 启动了,并且在构造函数中令牌为空。实际上是相同的标记。
我检查了“security.token_storage”是否正确自动装配,我也试图在 service.yml 中强制它
这让我很困惑。UsageTrackingStorage 的这两个实例之间的唯一区别是一个在控制器中使用,另一个在订阅者中使用。但它应该注入相同的实例......
哔哔one