Nano Hash - криптовалюты, майнинг, программирование

Получить текущего вошедшего в систему пользователя в объекте

Я хочу создать некоторые виртуальные свойства для сущности в отношении n:m.

У меня есть сущность User, Achievment и AchievementUser. Значение, которое пользователь имеет в Достижении, хранится в поле value в объекте AchievementUser.

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

Теперь я хочу вернуть value пользователю в достижении с самим достижением. Итак, мне нужно виртуальное свойство и метод getValue() в объекте Achievement, но чтобы получить соответствующий объект AchievementUser, мне нужен идентификатор текущего вошедшего в систему пользователя.

Как я могу получить это? Или есть другая возможность получить пользовательское значение для достижения? Спасибо за вашу помощь!

Изменить: у меня есть только приложение на основе API. Только сериализатор выполняет метод Getter. Вот содержимое моего файла сериализатора:

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

  • Разве это не классический многие ко многим (с таблицей соединений AchievementUser)? Как вы определили отношения, какой-то код?. Причина в том, что многие ко многим можно получить пользователя по текущему идентификатору пользователя, а затем с помощью магии доктрины просто получить доступ к свойству отношения (например, например: user->getAchievements()) 29.05.2017

Ответы:


1

Вы можете реализовать метод в объекте 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 } ]
29.05.2017
  • Проблема в том, что у меня есть только приложение на основе API. Таким образом, только сериализатор использует метод get. Я добавил дополнительную информацию о своем приложении. Можно ли там определить параметр? 29.05.2017
  • Обновил мой ответ. Надеюсь, это поможет вам в достижении вашей цели. 29.05.2017
  • @MikhailProsalov К сожалению, ответ не работает. Свойство всегда будет пустым {}. См. этот вопрос: stackoverflow.com/questions/45441456/ Не могли бы вы мне помочь? 01.08.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..