ฉันพยายามที่จะขยาย การทำให้เป็นอนุกรม เพื่อรับ ฟิลด์ JSON โมดูลเพื่อส่งคืนวัตถุ JSON แทน JSON ที่สตริง
เป้าหมาย: เมื่อฉันเข้าถึงเอนทิตีที่มีฟิลด์ JSON โดยใช้ JSON:API ฉันต้องการวัตถุ JSON สำหรับค่าฟิลด์ (ปัจจุบัน JSON แบบสตริงจะถูกส่งคืน)
ฉันคิดว่าสิ่งที่ฉันต้องทำคือขยายหนึ่งใน core normalizers และใช้เพื่อเพิ่ม a json_decode()
ขั้นตอน
มีบางอย่าง เอกสารเกี่ยวกับวิธีที่ Serializer จัดการกับเอนทิตี แต่ล้าสมัย (อัปเดตครั้งล่าสุดในปี 2560 ก่อนที่ 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, array $context = []) {
$field_name = $field->getName();
\Drupal::logger('json_field')->info("ฟิลด์มีชื่อ $field_name");
ยืนยัน ($ ฟิลด์อินสแตนซ์ของ NativeJSONItem);
/** @var \Drupal\Core\Field\FieldItemListInterface $field */ $normalized_items = $this->normalizeFieldItems($field, $format, $context);
ยืนยัน ($ บริบท ['resource_object'] อินสแตนซ์ของ 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.views:
คลาส: Drupal\json_field\JSONViews
json_field.normalizer.field.json_field:
คลาส: Drupal\json_field\Normalizer\JsonFieldNormalizer
แท็ก:
- { ชื่อ: normalizer, ลำดับความสำคัญ: 1 }
อย่างไรก็ตาม หลังจากสร้างแคชใหม่และเข้าถึงฟิลด์ JSON บางส่วนผ่าน JSON:API แล้ว ฉันไม่เห็นสิ่งใดในบันทึก ดังนั้นดูเหมือนว่าจะไม่มีการรับคลาส