Я создаю 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.
причина того, что я не использую сериализатор Symfony, заключается в том, что он утомил меня зависимостями объекта :'(. Я попробую сейчас.




Как я сказал в своем комментарии, вы можете использовать сериализатор 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...
Допустим, у вас есть объект с именем 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. это очень просто:
composer require symfony/serializer
.....//
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 или другими проблемами;)
Не по теме. Почему вы хотите использовать JMSSerializer вместо стандартного сериализатора Symfony? Кстати, выполните exec php /bin/console debug:container и проверьте, есть ли служба. С другой стороны, наилучшей практикой является внедрение сериализатора конструктором.