Как установить свойство Entity в Symfony2 которое является результатом работы сервиса?

Как вы поступаете, если нужно установить какое-то свойство модели как результат работы другого сервиса. Например, есть ресурс к которому можно получить доступ предъявив код доступа(token). Код генерируется сервисом на основании [param + secret + expire] => hash

Данные модели возвращаются клиенту в виде JSON данных списком ресурсов вместе с ключами к каждому ресурсу. Как такое правильно реализовать на Symfony?
  • Вопрос задан
  • 665 просмотров
Решения вопроса 1
grabbee
@grabbee Автор вопроса
Добавил слушатель событий как сервис через таги, чтобы внедрить в листенер свой сконфигурированный сервис по описанию для доктрины
doctrine/event_listeners_subscribers затем чуть чуть из
service_container#tags

In Doctrine 2.4, a feature called Entity Listeners was introduced. It is a lifecycle listener class used for an entity. You can read about it in the Doctrine Documentation.


Там описана необходимая аннотация [/** @Entity @EntityListeners({"UserListener"}) */] был кусок кода, но не было описана реализация внедрения зависимости:
<?php
// User.php

/** @Entity @EntityListeners({"UserListener"}) */
class User
{
    // ....
}

// UserListener.php
class UserListener
{
    public function __construct(MyService $service)  <<<
    {
        $this->service = $service;
    }

    public function preUpdate(User $user, PreUpdateEventArgs $event)
    {
        $this->service->doSomething($user);
    }
}

// register a entity listener.
$listener = $container->get('user_listener');
$em->getConfiguration()->getEntityListenerResolver()->register($listener);


Итого:
1. Указать аннотацию ссылающуюся на класс слушателя событий
2. Создать класс слушателя и описать логику необходимую для установки свойств сущности задействуя внешние сервисы
3. Внедрить эти сервисы как аргументы слушателя в конструктор класса
4. С помощью тега name: doctrine.orm.entity_listener зарегистрировать слушатель/сервис

Застрелите меня((
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы