я пытаюсь расширить Сериализация чтобы получить Поле JSON модуль для возврата объекта JSON вместо строкового JSON.
Цель: когда я получаю доступ к объекту, содержащему поле JSON, с помощью JSON:API, мне нужен объект JSON для значения поля (в настоящее время возвращается строковый JSON).
Я думаю, что мне нужно расширить один из основных нормализаторов и использовать его для добавления json_decode()
шаг.
Существует некоторое документация о том, как Serializer обрабатывает сущности но он устарел (последний раз обновлялся в 2017 году до того, как JSON:API стал частью ядра, и текущий код не похож на то, что показано).
Я попытался расширить FieldNormalizer в /json_field/src/Normalizer/JsonFieldNormalizer.php
.
Однако я не уверен, что это правильный подход, так как есть также FieldItemNormalizer и TypedDataNormalizer. Чтобы изменить способ вывода поля в JSON:API, какой класс следует расширить?
<?php
пространство имен Drupal\json_field\Normalizer;
используйте Drupal\Core\Field\FieldDefinitionInterface;
используйте Drupal\json_field\Plugin\Field\FieldType\NativeJSONItem;
используйте Drupal\jsonapi\JsonApiResource\ResourceObject;
используйте Drupal\jsonapi\Normalizer\FieldNormalizer;
используйте Drupal\jsonapi\Normalizer\Value\CacheableNormalization;
используйте Drupal\jsonapi\ResourceType\ResourceType;
класс JsonFieldNormalizer расширяет FieldNormalizer {
/**
* {@inheritdoc}
*/
защищенный $supportedInterfaceOrClass = NativeJSONItem::class;
/**
* {@inheritdoc}
*/
публичная функция normalize($field, $format = NULL, массив $context = []) {
$field_name = $field->getName();
\Drupal::logger('json_field')->info("Поле имеет имя $field_name");
assert($field instanceof NativeJSONItem);
/** @var \Drupal\Core\Field\FieldItemListInterface $field */ $normalized_items = $this->normalizeFieldItems($field, $format, $context);
assert($context['resource_object'] instanceof ResourceObject);
вернуть $context['resource_object']->getResourceType()->getFieldByInternalName($field->getName())->hasOne()
? array_shift($normalized_items) ?: CacheableNormalization::permanent(NULL)
: CacheableNormalization::aggregate($normalized_items);
}
И я добавил класс в json_field.services.yml
:
Сервисы:
json_field.просмотры:
класс: Drupal\json_field\JSONViews
json_field.normalizer.field.json_field:
класс: Drupal\json_field\Normalizer\JsonFieldNormalizer
теги:
- {имя: нормализатор, приоритет: 1}
Однако после восстановления кеша и доступа к некоторым полям JSON через JSON:API я ничего не вижу в журналах, поэтому кажется, что класс не подхватывается.