获取当前登录用户的实体

时间:2017-05-29 13:30:35

标签: symfony doctrine-orm symfony-3.2

我想为n:m关系中的实体创建一些虚拟属性。

我有一个User,一个Achievment和一个AchievementUser实体。用户在成就中拥有的值存储在实体value的字段AchievementUser中。

User -------- 1:n -------- AchievementUser -------- n:1 -------- Achievement
name:String                value:Integer                         name:String
[...]                                                            [...]

现在我想要返回一个用户拥有成就本身的value。所以我需要getValue()实体中的虚拟属性和方法Achievement,但要获取相应的AchievementUser对象,我需要当前登录用户的ID。

我怎么能得到这个?或者是否有其他可能性来获得成就的用户价值?谢谢你的帮助!

编辑:我只有基于API的应用程序。只有序列化程序执行Getter方法。这是我的序列化文件的内容:

virtual_properties:
    getValue:
        serialized_name: value
        type: integer
        groups: ['achievement_default']

2 个答案:

答案 0 :(得分:5)

您可以在Achievement实体中实现一个方法,并将当前经过身份验证的用户从twig模板的控制器传递给它。

use Doctrine\Common\Collections\Criteria;

// ...

/**
 * @return Collection
 */
public function getAchievementUsers(User $user)
{
    $criteria = Criteria::create()->where(Criteria::expr()->eq('user', $user));

    return $this->achievementUsers->matching($criteria);
}

如果使用JMS序列化程序,您可以使用getAchievementUsers方法添加虚拟字段并使用数据填充它,方法是定义序列化侦听器并注入TokenStorage以检索当前经过身份验证的用户。

<?php

namespace AppBundle\Listener\Serializer;

...
use JMS\Serializer\GenericSerializationVisitor;
use JMS\Serializer\EventDispatcher\ObjectEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;

class AchievementSerializerListener
{
    /**
     * @var User
     */
    protected $currentUser;

    /**
     * @param TokenStorage $tokenStorage
     */
    public function __construct(TokenStorage $tokenStorage)
    {
        $this->currentUser = $tokenStorage->getToken()->getUser();
    }

    /**
     * @param ObjectEvent $event
     */
    public function onAchievementSerialize(ObjectEvent $event)
    {
        if (!$this->currentUser) {
            return;
        }

        /** @var Achievement $achievement */
        $achievement = $event->getObject();

        /** @var GenericSerializationVisitor $visitor */
        $visitor = $event->getVisitor();

        $visitor->setData(
            'achievement_users',
            $achievement->getAchievementUsers($this->currentUser)
        );
    }
}

services.yml

  app.listener.serializer.achievement:
        class: AppBundle\Listener\Serializer\AchievementSerializerListener
        arguments:
          - '@security.token_storage'
        tags: [ { name: jms_serializer.event_listener, event: serializer.post_serialize, class: AppBundle\Entity\Achievement, method: onAchievementSerialize } ]

答案 1 :(得分:-3)

获取当前登录用户的ID:

$ user = $ this-&gt; getUser() - &gt; getId();