Функция службы вызова аксессуаров Symfony JMSSerializer

У меня есть Entity UserProfile, который содержит поле profileImage, которое является fileKey

Когда вызывается мой контроллер REST, и ему необходимо отобразить Board, который где-то содержит объект UserProfile, я хочу, чтобы он возвращал полный URL-адрес с fileKey.

Поскольку я не могу использовать Сервисы и т. Д. В Сущностях, я подумал, можно ли вызвать Сервис через Аксессор?

http://jmsyst.com/libs/serializer/master/reference/annotations#accessor

Как я могу позвонить, например, Сервис внутри аксессуара? Или есть другие возможности?


person develth    schedule 12.05.2017    source источник


Ответы (1)


Чтобы использовать службу в аксессоре, вам нужно будет внедрить службу в сущность или использовать статический фасад для вызова службы. Это не рекомендуется, так как это сильно связывает объект со службой.

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

Обработчик может выглядеть следующим образом:

class ProfileImageUrlHandler implements SubscribingHandlerInterface
{
    public function __construct(Service $service)
    {
        $this->service = $service;
        parent::__construct();
    }

    public static function getSubscribingMethods()
    {
        return array(
            array(
                'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
                'format' => 'json',
                'type' => 'FQCN\Of\ProfileImageUrl',
                'method' => 'serializeProfileImageUrlToJson',
            ),
        );
    }

    public function serializeProfileImageUrlToJson(JsonSerializationVisitor $visitor, ProfileImageUrl $imageNAme, array $type, Context $context)
    {
        return $this->service->buildUrl($imageName);
    }
}

В Symfony вы можете использовать любую службу в качестве обработчика, пометив ее как здесь :

<service id="service_id" class="Service">
    <tag name="jms_serializer.handler" 
         type="FQCN\Of\ProfileImageUrl" 
         direction="serialization" 
         format="json"
         method="imageToUrl" />
</service>

И, наконец, у вас есть возможность использовать службу в событии post_rserialize < / а>. В документации предполагается, что ссылки должны быть добавлены туда, но, на мой вкус, это не наглядно и пахнет волшебством.

person Alex Blex    schedule 12.05.2017
comment
Спасибо! Когда вы говорите, что это не рекомендуется, вы имеете в виду фасад или идею внедрения службы в сущность? - person develth; 12.05.2017
comment
Оба. Идея использовать маршрутизатор в сущности для создания URL-адресов довольно далека от лучших практик, поскольку требует дополнительных зависимостей и ужесточает связи между компонентами. Не имеет значения, как вызывается служба - вводится через конструктор, установщик или вызывается статически. Если он вообще используется в геттере, это делает модель зависимой от него. Модели не должны выполнять работу Вью. - person Alex Blex; 12.05.2017
comment
Мне нужно было работать с EventSubscriberInterface. profileImage был просто строкой, поэтому jms_serializer.handler не подходил. Спасибо еще раз! - person develth; 12.05.2017