Как правильно ввести Symfony Serializer в контроллер? - PullRequest
0 голосов
/ 20 февраля 2019

У меня проблема с введением Symfony Serializer в контроллер.Вот рабочий пример того, какое поведение я хочу достичь:

public function someAction(): Response
{
    $goodViews = //here I get an array of Value Objects or DTO's ;

    $serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);

    // normalize gives me a proper array for serialization
    return $this->json(
         $serializer->normalize($goodViews)
    );
}

Но теперь мне нужно изменить непосредственное создание Serializer с внедрением зависимости в конструктор контроллеров или действие.Другой способ, я думаю, состоит в том, чтобы создать службу, которая получит ObjectNormalizer и JsonEncoder в качестве аргументов, затем создаст Serializer и затем нормализует массивы объектов в специальном методе и вернет результат.Но я не могу понять, как создать сериализатор в service.yml или правильно описать служебные зависимости.Symfony docs также получает простой сервис сериализатора или создает его вручную, как я делал в примере кода.

Я думал получить сервис сериализатора из контейнера сервиса в действии (с $ this-> get ('serializer')) или внедрить его в конструктор контроллеров с помощью NormalizerInterface (мне нужно в основном нормализовать массивы объектов), но этот внедренный сериализатор упал с такой ошибкой:

"message": "Невозможно нормализовать атрибут \"options \ ", потому что введенный сериализатор не является нормализатором", "class": "Symfony \ Component \ Serializer \ Exception \ LogicException",

, поэтому я предполагаю, что его не настроено таким образом, чтобы ямы выполнили создание Serializer вручную.

Наша версия Symfony - 3.4. Спасибо за ваше внимание.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Решение моей проблемы немного сложнее.ObjectNormalizer был переопределен пользовательским нормализатором (с украшать часть в определении пользовательской службы - см. https://symfony.com/doc/3.4/service_container/service_decoration.html). Вот почему в предварительно настроенной платформе Symfony Serializer я получил наш пользовательский, который выдал ошибку:

Невозможно нормализовать атрибут \ "options \", потому что введенный сериализатор не является нормализатором

Итак, я создал новый сервис сериализатора с ObjectNormalizer:

new_api.serializer_with_object_normalizer:
    class: Symfony\Component\Serializer\Serializer
    arguments:
        0:
            - "@our_custom_serviec_which_override_object_normalizer.inner"
        1:
            - "@serializer.encoder.json"
0 голосов
/ 21 февраля 2019
public function someAction(SerializerInterface $serializer): Response // Add serializer as an argument
{
    $goodViews = //here I get an array of Value Objects or DTO's ;

    // normalize gives me a proper array for serialization
    return $this->json(
         $serializer->normalize($goodViews)
    );
}

В services.yml

# *Bundle/Resources/services.yaml
services:
    YourNamespace/*Bundle/Controller/YourController:
        tags: [ 'controller.service_arguments' ]

Попробуйте и дайте нам знать.Это должно помочь вам, но есть более эффективные способы настройки вашего проекта.Проверьте здесь для получения дополнительной информации об использовании контроллеров в качестве сервисов и как их автоматически подключать.

https://symfony.com/doc/3.4/service_container.html

https://symfony.com/doc/3.4/serializer.html

...