Як створити користувацький перетворювач імен

Дата оновлення перекладу 2025-01-17

Як створити користувацький перетворювач імен

Компонент Serializer використовує перетворювачі імен для перетворення імен атрибутів (наприклад, з snake_case в JSON на CamelCase для властивостей PHP).

Уявіть, що у вас є наступний об'єкт:

1
2
3
4
5
6
7
namespace App\Model;

class Company
{
    public string $name;
    public string $address;
}

А в серіалізованій формі всі атрибути повинні мати префікс org_, наприклад як тут:

1
{"org_name": "Acme Inc.", "org_address": "123 Main Street, Big City"}

Користувацький перетворювач імен може впоратися з такими випадками:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace App\Serializer;

use Symfony\Component\Serializer\NameConverter\NameConverterInterface;

class OrgPrefixNameConverter implements NameConverterInterface
{
    public function normalize(string $propertyName, ?string $class = null, ?string $format = null, array $context = []): string
    {
        // додати префікс під час нормалізації
        return 'org_'.$propertyName;
    }

    public function denormalize(string $propertyName, ?string $class = null, ?string $format = null, array $context = []): string
    {
        // видалити префікс 'org_' при денормалізації
        return str_starts_with($propertyName, 'org_') ? substr($propertyName, 4) : $propertyName;
    }
}

7.1

Отримання доступу до поточного імені класу, формату та контексту через normalize() та denormalize() було представлено в Symfony 7.1.

Note

Ви також можете реалізувати AdvancedNameConverterInterface, щоб отримати доступ до поточного імені класу, формату та контексту.

Потім сконфігуруйте серіалізатор, щоб використовувати ваш перетворювач імен:

1
2
3
4
5
# config/packages/serializer.yaml
framework:
    serializer:
        # передати ID сервіса вашого перетворювача імен
        name_converter: 'App\Serializer\OrgPrefixNameConverter'

Тепер, при використанні серіалізатора у додатку, до всіх атрибутів буде додано префікс org_:

1
2
3
4
5
6
7
// ...
$company = new Company('Acme Inc.', '123 Main Street, Big City');

$json = $serializer->serialize($company, 'json');
// {"org_name": "Acme Inc.", "org_address": "123 Main Street, Big City"}
$companyCopy = $serializer->deserialize($json, Company::class, 'json');
// Ті ж дані, що і $company