Symfony从实体获取连接用户id


Symfony get connected user id from entity

在Symfony2.8/Doctrine2应用程序中,我需要在SQL表的每一行中存储创建或更新该行的用户的id(用户可以连接Ldap)。

我的所有实体都继承了包含这个变量的GenericEntity(如果我想存储Ldap用户名,类型将是字符串):

/**
 * @var integer
 *
 * @ORM'Column(name="zzCreationId", type="string", nullable=false)
 */
private $creationId;

我使用prePersistCallback()自动分配这个值:

/**
 * @ORM'PrePersist
 */
public function prePersistCallback()
{
    $currentUser = /* ...... ????? ....... */ ;
    if ($currentUser->getId() != null) {
        $this->creationId = $currentUser->getId() ;
    } else {
        $this->creationId = 'unknown' ;
    }
    return $this;
}

但是我不知道如何检索连接的用户,或者如何在实体中自动注入它…我该怎么做呢?

您可以使用Doctrine实体侦听器/订阅者来注入安全令牌并获取当前登录的用户:

// src/AppBundle/EventListener/EntityListener.php
namespace AppBundle'EventListener;
use Doctrine'ORM'Event'LifecycleEventArgs;
use AppBundle'Entity'GenericEntity;
use Symfony'Component'Security'Core'Authentication'Token'Storage'TokenStorageInterface;
class EntityListener
{
    private $tokenStorage;
    public function __construct(TokenStorageInterface $tokenStorage = null) 
    {
        $this->tokenStorage = $tokenStorage;
    }
    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        // only act on "GenericEntity"
        if (!$entity instanceof GenericEntity) {
            return;
        }
        if (null !== $currentUser = $this->getUser()) {
            $entity->setCreationId($currentUser->getId());
        } else {
            $entity->setCreationId(0);
        }
    }
    public function getUser()
    {
        if (!$this->tokenStorage) {
            throw new 'LogicException('The SecurityBundle is not registered in your application.');
        }
        if (null === $token = $this->tokenStorage->getToken()) {
            return;
        }
        if (!is_object($user = $token->getUser())) {
            // e.g. anonymous authentication
            return;
        }
        return $user;
    }
}

下一个注册监听器:

# app/config/services.yml
services:
    my.listener:
        class: AppBundle'EventListener'EntityListener
        arguments: ['@security.token_storage']
        tags:
            - { name: doctrine.event_listener, event: prePersist }

@ORM'PrePersist和实体中使用的其他回调方法应该包含简单的逻辑,并且独立于其他服务。

需要创建事件侦听器或订阅器来侦听postPersist学说事件,并填写相应的属性。查看如何注册事件侦听器和订阅器

您可以查看gedmo/doctrine-extensions包中的blameabllistener,它几乎可以按您想要的方式工作,但使用用户名而不是用户id。