Tôi đang cố gắng mở rộng Tuần tự hóa để có được Trường JSON module để trả về một đối tượng JSON thay vì JSON được xâu chuỗi.
Mục tiêu: Khi tôi truy cập vào một thực thể chứa trường JSON bằng cách sử dụng JSON:API, tôi muốn có một đối tượng JSON cho giá trị trường (hiện tại, JSON được xâu chuỗi hóa được trả về).
Tôi nghĩ những gì tôi cần làm là mở rộng một trong những bộ chuẩn hóa cốt lõi và sử dụng nó để thêm một json_decode()
bước chân.
Có một số tài liệu về cách Serializer xử lý các thực thể nhưng nó đã lỗi thời (cập nhật lần cuối vào năm 2017 trước khi JSON:API là một phần của lõi và mã hiện tại không giống như những gì được hiển thị.)
Tôi đã thử mở rộng FieldNormalizer trong /json_field/src/Normalizer/JsonFieldNormalizer.php
.
Tuy nhiên, tôi không tự tin rằng đây là cách tiếp cận đúng, vì cũng có FieldItemNormalizer và TypedDataNormalizer. Để thay đổi cách một trường được xuất ra trong JSON:API, tôi nên mở rộng lớp nào?
<?php
không gian tên Drupal\json_field\Normalizer;
sử dụng Drupal\Core\Field\FieldDefinitionInterface;
sử dụng Drupal\json_field\Plugin\Field\FieldType\NativeJSONItem;
sử dụng Drupal\jsonapi\JsonApiResource\ResourceObject;
sử dụng Drupal\jsonapi\Normalizer\FieldNormalizer;
sử dụng Drupal\jsonapi\Normalizer\Value\CacheableNormalization;
sử dụng Drupal\jsonapi\ResourceType\ResourceType;
lớp JsonFieldNormalizer mở rộng FieldNormalizer {
/**
* {@inheritdoc}
*/
được bảo vệ $supportedInterfaceOrClass = NativeJSONItem::class;
/**
* {@inheritdoc}
*/
public function normalize($field, $format = NULL, array $context = []) {
$field_name = $field->getName();
\Drupal::logger('json_field')->info("Trường có tên $field_name");
khẳng định($field instanceof NativeJSONItem);
/** @var \Drupal\Core\Field\FieldItemListInterface $field */ $normalized_items = $this->normalizeFieldItems($field, $format, $context);
khẳng định($context['resource_object'] instanceof ResourceObject);
trả về $context['resource_object']->getResourceType()->getFieldByInternalName($field->getName())->hasOne()
? array_shift($normalized_items) ?: CacheableNormalization:: Permanent(NULL)
: CacheableNormalization::aggregate($normalized_items);
}
Và tôi đã thêm lớp vào json_field.services.yml
:
dịch vụ:
json_field.views:
lớp: Drupal\json_field\JSONViews
json_field.normalizer.field.json_field:
lớp: Drupal\json_field\Normalizer\JsonFieldNormalizer
thẻ:
- { tên: chuẩn hóa, ưu tiên: 1 }
Tuy nhiên, sau khi xây dựng lại bộ đệm và truy cập một số trường JSON qua JSON:API, tôi không thấy bất kỳ nội dung nào trong nhật ký, vì vậy có vẻ như lớp không được chọn.