Як створити користувацький перетворювач імен
Дата оновлення перекладу 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