Новое в Symfony 7.2: Именованные сериализаторы
- Pull Request: [Serializer] Introduce named serializers #56823 HypeMC
В Symfony 7.2 компонент Serializer позволяет настроить несколько экземпляров сериализатора с различными контекстами по умолчанию, конвертерами имён, наборами нормализаторов и кодировщиков. Это удобно, если ваше приложение взаимодействует с несколькими API, каждый из которых использует свои правила.
Во-первых, используйте новую опцию named_serializers
, чтобы определить различные сериализаторы и их контексты:
# config/packages/serializer.yaml
serializer:
named_serializers:
api_client1:
name_converter: 'serializer.name_converter.camel_case_to_snake_case'
default_context:
enable_max_depth: true
api_client2:
default_context:
enable_max_depth: false
Теперь можно внедрять различные сериализаторы с помощью именованных псевдонимов, включая атрибут Target
:
class HomeController extends AbstractController
{
#[Route('/', name: 'app_home')]
public function index(
SerializerInterface $serializer, // Сериализатор по умолчания
SerializerInterface $apiClient1Serializer, // Сериализатор api_client1
#[Target('apiClient2.serializer')] // Сериализатор api_client2
SerializerInterface $someName,
) {
// ...
}
}
Если вы определяете кастомные нормализаторы, то можете применять их только к определённым сериализаторам благодаря атрибуту тега serializer
(если не установить этот атрибут, нормализатор будет применяться только к сериализатору default
):
get_set_method_normalizer:
class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
autoconfigure: false # это необходимо, поэтому он не включён в сериализатор по умолчанию
tags:
# единственный сериализатор
- serializer.normalizer: { serializer: 'api_client1' }
# или несколько
- serializer.normalizer: { serializer: [ 'api_client1', 'api_client2' ] }
# используйте *, чтобы включить сервис во все сериализаторы, включая используемый по умолчанию
- serializer.normalizer: { serializer: '*' }
Наконец, поскольку Symfony поставляется со встроенными нормализаторами и кодировщиками, появились новые опции, позволяющие исключить их, если не хотите их использовать:
serializer:
named_serializers:
api_client1:
include_built_in_normalizers: false
include_built_in_encoders: true
# ...