Как использовать JMSSerializer с Symfony 4.2

Я создаю API с Symfony 4.2 и хочу использовать jms-serializer для сериализации своих данных в формате Json после его установки с помощью

composer require jms/serializer-bundle

и когда я пытаюсь использовать его таким образом:

``` demands = $demandRepo->findAll();
    return $this->container->get('serializer')->serialize($demands,'json');```

это дает мне эту ошибку:

Service "serializer" not found, the container inside "App\Controller\DemandController" is a smaller service locator that only knows about the "doctrine", "http_kernel", "parameter_bag", "request_stack", "router" and "session" services. Try using dependency injection instead.

Не по теме. Почему вы хотите использовать JMSSerializer вместо стандартного сериализатора Symfony? Кстати, выполните exec php /bin/console debug:container и проверьте, есть ли служба. С другой стороны, наилучшей практикой является внедрение сериализатора конструктором.

AythaNzt 16.04.2019 14:45

причина того, что я не использую сериализатор Symfony, заключается в том, что он утомил меня зависимостями объекта :'(. Я попробую сейчас.

Méd Hassona 16.04.2019 15:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
2
2 032
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Как я сказал в своем комментарии, вы можете использовать сериализатор Symfony по умолчанию и использовать его, вводя его конструктором.

//...

use Symfony\Component\Serializer\SerializerInterface;

//...

class whatever 
{
    private $serializer;

    public function __constructor(SerializerInterface $serialzer)
    {
        $this->serializer = $serializer;
    }

    public function exampleFunction()
    {
        //...
        $data = $this->serializer->serialize($demands, "json");
        //...
    }
}

Это не решает проблему с сериализатором JMS...

Herz3h 06.07.2021 15:39

Допустим, у вас есть объект с именем Foo.php, у которого есть id, name и description.

И вы хотели бы вернуть только id, и name при использовании определенного API, такого как foo/summary/, в другой ситуации также необходимо вернуть descriptionfoo/details

здесь сериализатор действительно полезен.

use JMS\Serializer\Annotation as Serializer;

/*
* @Serializer\ExclusionPolicy("all")
*/
class Foo {
    /**
    * @Serializer\Groups({"summary", "details"})
    * @Serializer\Expose()
    */
    private $id;

    /**
    * @Serializer\Groups({"summary"})
    * @Serializer\Expose()
    */
    private $title;

    /**
    * @Serializer\Groups({"details"})
    * @Serializer\Expose()
    */
    private $description;

}

давайте использовать сериализатор для получения данных, зависит от группы

class FooController {
    public function summary(Foo $foo, SerializerInterface $serialzer)
    {
        $context = SerializationContext::create()->setGroups('summary');
        $data = $serialzer->serialize($foo, json, $context);

        return new JsonResponse($data);
    }

    public function details(Foo $foo, SerializerInterface $serialzer)
    {
        $context = SerializationContext::create()->setGroups('details');
        $data = $serialzer->serialize($foo, json, $context);

        return new JsonResponse($data);
    }
}

Наконец я нашел ответ, используя сериализатор Symfony. это очень просто:

  • первый: установить сериализатор symfony с помощью команды:

composer require symfony/serializer

  • второй: с помощью serializerInterface:

.....//

use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;

// .....

.... //

 /**
     * @Route("/demand", name = "demand")
     */
    public function index(SerializerInterface $serializer)
    {
        $demands = $this->getDoctrine()
            ->getRepository(Demand::class)
            ->findAll();

        if ($demands){
            return new JsonResponse(
                $serializer->serialize($demands, 'json'),
                200,
                [],
                true
            );
        }else{
            return '["message":"ooooops"]';
        }

    }
    
    //......
    

и с этим я не нахожу проблем с зависимостями или DateTime или другими проблемами;)

Другие вопросы по теме