symfony - Obtener el usuario registrado actualmente en la entidad
doctrine2 symfony-3.2 (2)
Quiero crear algunas propiedades virtuales para una entidad en una relación n:m
.
Tengo un User
, una Achievment
y una entidad de AchievementUser
User
. El valor que un usuario tiene en un logro se almacena en el value
del campo en la entidad AchievementUser
.
User -------- 1:n -------- AchievementUser -------- n:1 -------- Achievement
name:String value:Integer name:String
[...] [...]
Ahora quiero devolver el value
un usuario tiene en un logro con el logro mismo. Por lo tanto, necesito una propiedad virtual y un método getValue()
en la entidad Achievement
, pero para obtener el objeto AchievementUser
correspondiente, necesito el ID del usuario registrado actualmente.
¿Cómo puedo conseguir esto? ¿O hay otra posibilidad de obtener el valor del usuario para un logro? ¡Gracias por tu ayuda!
Editar: solo tengo una aplicación basada en API. Solo el serializador ejecuta el método Getter. Aquí está el contenido de mi archivo de serializador:
virtual_properties:
getValue:
serialized_name: value
type: integer
groups: [''achievement_default'']
Para obtener el ID del usuario que inició sesión actualmente:
$ usuario = $ this-> getUser () -> getId ();
Puede implementar un método en la entidad Achievement y pasarle el usuario autenticado actual desde su controlador de la plantilla 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);
}
En caso de utilizar un serializador JMS, puede agregar un campo virtual y completarlo con el método getAchievementUsers definiendo un detector de serialización e inyectando TokenStorage para recuperar el usuario autenticado actual.
<?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 } ]