How to Create your Custom Name Converter
The Serializer Component uses name converters to transform the attribute names (e.g. from snake_case in JSON to CamelCase for PHP properties).
Imagine you have the following object:
1 2 3 4 5 6 7
namespace App\Model;
class Company
{
public string $name;
public string $address;
}
And in the serialized form, all attributes must be prefixed by org_
like
the following:
1
{"org_name": "Acme Inc.", "org_address": "123 Main Street, Big City"}
A custom name converter can handle such cases:
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
{
// during normalization, add the prefix
return 'org_'.$propertyName;
}
public function denormalize(string $propertyName): string
{
// remove the 'org_' prefix on denormalizing
return str_starts_with($propertyName, 'org_') ? substr($propertyName, 4) : $propertyName;
}
}
Note
You can also implement AdvancedNameConverterInterface to access the current class name, format and context.
Then, configure the serializer to use your name converter:
1 2 3 4 5
# config/packages/serializer.yaml
framework:
serializer:
# pass the service ID of your name converter
name_converter: 'App\Serializer\OrgPrefixNameConverter'
Now, when using the serializer in the application, all attributes will be
prefixed by 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');
// Same data as $company
This work, including the code samples, is licensed under a
Creative Commons BY-SA 3.0 license.