Использовать пользовательский нормализатор и поддержку нормализации - PullRequest
0 голосов
/ 18 января 2019

Я хочу (де) нормализовать свои данные, следуя "примеру", найденному в документе здесь , но метод supportNormalization для AbstractItemNormalizer всегда возвращает false.

Поскольку документ совершенно бесполезен в отношении того, что должно быть сделано и как, кто-нибудь может мне здесь помочь? Я нигде не могу найти рабочий пример.

1 Ответ

0 голосов
/ 24 января 2019

Сначала мы можем увидеть из определения метода:

/**
 * Checks whether the given class is supported for normalization by this normalizer.
 *
 * @param mixed  $data   Data to normalize
 * @param string $format The format being (de-)serialized from or into
 *
 * @return bool
 */
public function supportsNormalization($data, $format = null);

, что этот метод возвращает false, когда нормализация $data не поддерживается этим нормализатором. И только когда этот метод вернет true, будет вызван ваш normalize метод.

Первый параметр, который получает supportNormalization - это формат, например json, jsonapi, jsonhal и т. Д.

Так что, если в вашей конфигурации api_platform.yaml есть что-то вроде:

api_platform:
    formats:
         jsonld:   ['application/ld+json']

но вы в своей services.yaml службе регистрации:

services:
    'App\Serializer\CustomItemNormalizer':
        arguments: [ '@api_platform.serializer.normalizer.item' ]

supportNormalization всегда будет возвращать false, поскольку нормализатор ввода / декорации не поддерживает jsonld, и вам необходимо иметь:

services:
    'App\Serializer\CustomItemNormalizer':
        arguments: [ 'api_platform.jsonld.normalizer.item' ]

Здесь у вас есть список список доступных сериализаторов для определенного формата (в doc отсутствует сериализатор для JSONAPI).

В большинстве случаев я использую (де) нормализатор для изменения / добавления некоторых данных, но это возможно, если вы украсите нормализатор:

services:
    'App\Serializer\CustomItemNormalizer':
        decorates: 'api_platform.jsonld.normalizer.item'
        arguments: [ '@App\Serializer\CustomItemNormalizer.inner' ]

Ссылка на , декорирование сериализатора и добавление дополнительных данных .

Итак, в конце вам нужно ввести правильный нормализатор и украсить его.

...