Класс Serializer
Класс Serializer является центральным
компонентом Symfony для преобразования данных.
Он умеет превращать объекты в массивы и JSON,
а также выполнять обратное преобразование.
Внутри себя класс использует нормализаторы
и энкодеры. Нормализаторы отвечают за
преобразование объектов в массивы, а энкодеры
кодируют массивы в нужный формат (JSON, XML, CSV).
Класс реализует интерфейс SerializerInterface
и доступен через сервис serializer.
Основные методы: serialize для превращения
объекта в строку нужного формата,
deserialize для восстановления объекта
из строки, normalize для получения массива
из объекта и denormalize для сборки объекта
из массива.
Синтаксис
use SymfonyComponentSerializerSerializer;
$serializer = new Serializer($normalizers, $encoders);
Первым параметром передаётся массив нормализаторов,
вторым - массив энкодеров. Обычно объект
не создают вручную, а получают через
внедрение зависимости SerializerInterface.
Пример
Давайте создадим класс Article и
сериализуем его в JSON:
<?php
namespace AppEntity;
class Article
{
public string $title = '';
public text $body = '';
public integer $views = 0;
public boolean $published = false;
}
?>
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializerInterface;
class ArticleController extends AbstractController
{
public function index(SerializerInterface $serializer): Response
{
$article = new Article();
$article->title = 'article';
$article->views = 5;
$article->published = true;
$json = $serializer->serialize($article, 'json');
return new Response($json);
}
}
?>
Результат выполнения кода:
{"title":"article","body":"","views":5,"published":true}
Пример
Давайте восстановим объект из JSON при
помощи метода deserialize:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializerInterface;
class ArticleController extends AbstractController
{
public function index(SerializerInterface $serializer): Response
{
$json = '{"title":"article","views":5,"published":true}';
$article = $serializer->deserialize($json, Article::class, 'json');
return new Response($article->title);
}
}
?>
Результат выполнения кода:
"article"
Пример
Давайте получим массив из объекта при
помощи метода normalize:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializerInterface;
class ArticleController extends AbstractController
{
public function index(SerializerInterface $serializer): Response
{
$article = new Article();
$article->title = 'abcde';
$article->views = 3;
$res = $serializer->normalize($article);
return new Response(implode(', ', $res));
}
}
?>
Результат выполнения кода:
"abcde, , 3, "
Смотрите также
-
метод
serialize,
который превращает объект в строку формата -
метод
deserialize,
который восстанавливает объект из строки -
метод
normalize,
который превращает объект в массив -
метод
denormalize,
который собирает объект из массива