Метод denormalize класса Serializer
Метод denormalize класса Serializer выполняет обратное преобразование: он принимает массив данных и имя класса, а возвращает объект этого класса, заполненный переданными данными. Первым параметром передаётся массив данных, вторым - имя класса, в который нужно преобразовать массив. Третьим необязательным параметром можно передать имя формата, а четвёртым - массив контекста.
Синтаксис
denormalize(data, type, format = null, context = [])
Пример
Давайте создадим простую сущность Article и преобразуем в неё массив данных:
<?php
namespace AppEntity;
class Article
{
private string $title;
private string $text;
private int $views;
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): void
{
$this->title = $title;
}
public function getText(): string
{
return $this->text;
}
public function setText(string $text): void
{
$this->text = $text;
}
public function getViews(): int
{
return $this->views;
}
public function setViews(int $views): void
{
$this->views = $views;
}
}
?>
Теперь выполним денормализацию массива в объект Article:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializer;
use SymfonyComponentSerializerEncoderJsonEncoder;
use SymfonyComponentSerializerNormalizerObjectNormalizer;
class ArticleController extends AbstractController
{
public function index(): Response
{
$serializer = new Serializer(
[new ObjectNormalizer()],
[new JsonEncoder()]
);
$data = [
'title' => 'article',
'text' => 'abcde',
'views' => 5,
];
$article = $serializer->denormalize($data, Article::class);
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода:
"article"
Пример
Давайте денормализуем JSON-строку в объект Article, указав формат 'json':
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializer;
use SymfonyComponentSerializerEncoderJsonEncoder;
use SymfonyComponentSerializerNormalizerObjectNormalizer;
class ArticleController extends AbstractController
{
public function index(): Response
{
$serializer = new Serializer(
[new ObjectNormalizer()],
[new JsonEncoder()]
);
$json = '{"title":"article","text":"abcde","views":5}';
$article = $serializer->denormalize($json, Article::class, 'json');
return new Response((string) $article->getViews());
}
}
?>
Результат выполнения кода:
"5"
Пример
Давайте денормализуем массив массивов в массив объектов Article, передав тип Article::class . '[]':
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentSerializerSerializer;
use SymfonyComponentSerializerEncoderJsonEncoder;
use SymfonyComponentSerializerNormalizerObjectNormalizer;
class ArticleController extends AbstractController
{
public function index(): Response
{
$serializer = new Serializer(
[new ObjectNormalizer()],
[new JsonEncoder()]
);
$data = [
['title' => 'article', 'text' => 'abcde', 'views' => 1],
['title' => 'user', 'text' => 'hello', 'views' => 2],
];
$articles = $serializer->denormalize($data, Article::class . '[]');
$titles = array_map(
fn (Article $article) => $article->getTitle(),
$articles
);
return new Response(implode(', ', $titles));
}
}
?>
Результат выполнения кода:
"article, user"
Смотрите также
-
класс
Serializer,
который выполняет сериализацию и десериализацию данных -
метод
normalize,
который преобразует объект в массив -
метод
deserialize,
который преобразует строку в объект -
метод
serialize,
который преобразует объект в строку