Як створити ваш користувацький нормалізатор

Дата оновлення перекладу 2022-11-25

Як створити ваш користувацький нормалізатор

Компонент Серіалізатор використовує нормалізатори, щоб перетворити будь-які дані на масив. Компонент надає декілька вбудованих нормалізаторів, але вам може знадобитися створити власний нормалізатор, щоб перетворити непідтримувану структуру даних.

Створення нового нормалізатора

Уявіть, що ви хочете додати, змінити або видалити деякі властивості під час процесу серіалізації. Для цього вам потрібно буде створити власний нормалізатор. Але зазвичай бажано дозволити Symfony нормалізувати обʼєкт, а потім підключитися до нормалізації, щоб налаштувати нормалізовані дані. Щоб зробити це, використайте ObjectNormalizer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// src/Serializer/TopicNormalizer.php
namespace App\Serializer;

use App\Entity\Topic;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

class TopicNormalizer implements ContextAwareNormalizerInterface
{
    private $router;
    private $normalizer;

    public function __construct(UrlGeneratorInterface $router, ObjectNormalizer $normalizer)
    {
        $this->router = $router;
        $this->normalizer = $normalizer;
    }

    public function normalize($topic, string $format = null, array $context = [])
    {
        $data = $this->normalizer->normalize($topic, $format, $context);

        // Тут додайте, змініть або видаліть деякі дані:
        $data['href']['self'] = $this->router->generate('topic_show', [
            'id' => $topic->getId(),
        ], UrlGeneratorInterface::ABSOLUTE_URL);

        return $data;
    }

    public function supportsNormalization($data, string $format = null, array $context = [])
    {
        return $data instanceof Topic;
    }
}

Реєстрація у вашому додатку

Перед використанням цього нормалізатора у додатку Symfony, він повинен бути зареєстрований в якості сервісу та теговний за допомогою serializer.normalizer. Якщо ви використовуєте конфігурацію services.yaml за замовчуванням , це робиться автоматично!

Продуктивність

Щоб зрозуміти, який нормалізатор (або денормалізатор) має бути використано для обробки обʼєкта, клас Serializer циклічно викличе supportsNormalization() (або supportsDenormalization()) з усіх зареєстрованих нормалізаторів (або денормалізаторів).

Результат цих методів може відрізнятися в залежності від обʼєкта для серіалізації, формату та контектсу. Тому результат не кешується за замовчуванням, і може призвети до значного погіршення продуктивності.

Однак, більшість нормалізаторів (та денормалізаторів) завжди повертає однаковий результат, коли тип та формат обʼєкта співпадають, тому результат можна кешувати. Щоб зробити це, зробіть так, щоб ці нормалізатори (та денормалізатори) релізовували CacheableSupportsMethodInterface і повертали true, коли викликається hasCacheableSupportsMethod().

Note

Всі вбудовані нормалізатори та денормалізатори , а також ті, що включені у платформу API нативно реалізують цей інтерфейс.