Метод normalize
Метод normalize класса Serializer
преобразует объект или массив в массив
скалярных значений (чисел, строк, булевых
значений). Это промежуточный этап перед
финальной сериализацией в JSON или XML.
Метод принимает первым параметром данные
для нормализации, вторым - формат (обычно
'json'), третьим - массив контекста
с настройками.
Синтаксис
$serializer->normalize(mixed $data, ?string $format = null, array $context = []): mixed
Пример
Давайте нормализуем простой объект в массив:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
$encoders = [new JsonEncoder()];
$normalizers = [new ObjectNormalizer()];
$serializer = new Serializer($normalizers, $encoders);
$user = new \stdClass();
$user->name = 'abcde';
$user->age = 25;
$res = $serializer->normalize($user);
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
{"name":"abcde","age":25}
Пример
Давайте нормализуем массив объектов:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'article_list')]
public function list(): Response
{
$encoders = [new JsonEncoder()];
$normalizers = [new ObjectNormalizer()];
$serializer = new Serializer($normalizers, $encoders);
$item1 = new \stdClass();
$item1->title = 'article 1';
$item1->views = 100;
$item2 = new \stdClass();
$item2->title = 'article 2';
$item2->views = 200;
$res = $serializer->normalize([$item1, $item2]);
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"title":"article 1","views":100},{"title":"article 2","views":200}]
Пример
Давайте передадим контекст для группировки полей:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Annotation\Groups;
class User
{
#[Groups(['public'])]
public string $name = 'abcde';
#[Groups(['private'])]
public string $email = 'user@example.com';
}
class ArticleController extends AbstractController
{
#[Route('/user', name: 'user_show')]
public function show(): Response
{
$encoders = [new JsonEncoder()];
$normalizers = [new ObjectNormalizer()];
$serializer = new Serializer($normalizers, $encoders);
$user = new User();
$res = $serializer->normalize($user, null, ['groups' => ['public']]);
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
{"name":"abcde"}
Смотрите также
-
класс
Serializer,
который выполняет сериализацию данных -
метод
serialize,
который преобразует данные в строку формата -
метод
deserialize,
который восстанавливает объекты из строки -
метод
denormalize,
который преобразует массив в объект