我想为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']
答案 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();