symfony doctrine2 symfony-3.2

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 } ]