Điểm:1

Làm cách nào tôi có thể mở rộng Trình nối tiếp để xử lý loại trường tùy chỉnh?

lá cờ cn

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.

4uk4 avatar
lá cờ cn
Có một vài điều không nhất quán. Bạn đang mở rộng FieldNormalizer nhưng $supportedInterfaceOrClass là của một mục trường. Vì vậy, tốt hơn hãy mở rộng FieldItemNormalizer. Bạn đang triển khai trình nối tiếp jsonapi nhưng thẻ dịch vụ không phải là `{ name: jsonapi_normalizer, priority: 1 }`.
lá cờ cn
@4uk4 Cảm ơn, ban đầu tôi đã thử thêm nó dưới dạng `jsonapi_normalizer`, nhưng khi làm như vậy, tôi gặp lỗi `LogicException: JSON:API không cho phép thêm nhiều trình chuẩn hóa hơn!` Tôi vừa thử mở rộng FieldItemNormalizer và tôi nhận được vấn đề tương tự (không kích hoạt ghi nhật ký khi tôi truy cập trường thông qua JSON: API).
4uk4 avatar
lá cờ cn
OK, tôi vừa thử chỉ ra những điểm không nhất quán. Khi họ nói @internal, họ thực sự có ý đó. Đọc các nhận xét trong [vấn đề này](https://www.drupal.org/project/drupal/issues/2923779), bạn có thể cần thêm vào loại trường tùy chỉnh của mình một dữ liệu được nhập tùy chỉnh (bạn có thể chỉ cần mở rộng DataDefinition bây giờ bạn đã xác định trong thuộc tính trường) và sau đó xác định trình chuẩn hóa cho điều này.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.