Score:0

จะป้องกันไม่ให้บริการแบบกำหนดเองที่คล้ายกันขัดแย้งกันได้อย่างไร

ธง in

ฉันมีสองโมดูล ซึ่งแต่ละโมดูลกำหนดบริการนอร์มอลไลเซอร์

module_one.services.yml

บริการ:
  module_one.normalizer.node_entity:
    คลาส: Drupal\module_one\Normalizer\ModuleOneEntityNormalizer
    ข้อโต้แย้ง: ['@entity_type.manager']
    แท็ก:
      - { ชื่อ: normalizer, ลำดับความสำคัญ: 10 }

module_two.services.yml

บริการ:
  module_two.normalizer.node_entity:
    คลาส: Drupal\module_two\Normalizer\ModuleTwoEntityNormalizer
    ข้อโต้แย้ง: ['@entity_type.manager']
    แท็ก:
      - { ชื่อ: normalizer, ลำดับความสำคัญ: 10 }

สำหรับแต่ละโมดูล ฉันกำลังสร้าง Normalizer ที่แตกต่างกันและน่าจะกำหนดเนมสเปซแยกต่างหาก เช่น:

<?php

เนมสเปซ Drupal\module_one\Normalizer;

ใช้ Drupal\Core\Entity\EntityTypeManagerInterface;
ใช้ Drupal\serialization\Normalizer\ContentEntityNormalizer;
ใช้ Drupal\node\NodeInterface;

/**
 * แปลงโครงสร้างวัตถุเอนทิตี Drupal เป็นอาร์เรย์มาตรฐาน
 */
คลาส ModuleOneEntityNormalizer ขยาย ContentEntityNormalizer {
...

ปัญหาคือเมื่อเปิดใช้งานทั้งสองโมดูล บริการหนึ่งจะปิดกั้นอีกบริการหนึ่ง - serializer / normalizer จะเริ่มทำงานตามที่คาดไว้สำหรับอันแรก แต่ไม่ใช่สำหรับอันที่สอง วิธีเดียวที่จะทำให้อีกอันเป็นที่รู้จักคือเพิ่มลำดับความสำคัญ แต่นั่นจะบล็อกอันแรก

ฉันขาดอะไรในคำจำกัดความที่จะป้องกันไม่ให้บริการทั้งสองนี้ขัดแย้งกัน

อัปเดต: ขอบคุณสำหรับความคิดเห็นที่เป็นประโยชน์จริง ๆ เริ่มโทรเข้ามาในเรื่องนี้ Normalizer ทั้งสองมี $supportedInterface ที่ป้องกันเหมือนกัน เช่น:

  /**
   * อินเทอร์เฟซหรือคลาสที่ Normalizer นี้รองรับ
   *
   * @var สตริง
   */
  ป้องกัน $supportedInterfaceOrClass = [
    'Drupal\node\NodeInterface'
  ];

ซึ่งถูกตั้งค่าสถานะไว้ใน คู่มือ Drupal Serialization API เป็นประเด็น

Kevin avatar
in flag
ทำไมไม่เปลี่ยนลำดับความสำคัญแล้วปรับกฎการเลือกว่าจะใช้บังคับเมื่อใด https://api.drupal.org/api/drupal/core%21modules%21serialization%21src%21Normalizer%21NormalizerBase.php/function/NormalizerBase%3A%3AsupportsNormalization/9.2.x หากทำงานบนเอนทิตีประเภทเดียวกันทุกประการโดยไม่มี ความแตกต่างตามเงื่อนไข คุณอาจต้องเพิ่มข้อมูลบริบทเมื่อทำให้เป็นอันดับ
ru flag
หรืออาจจะเป็น[บริการตกแต่ง](https://symfony.com/doc/current/service_container/service_decoration.html)
4uk4 avatar
cn flag
คุณต้องชี้แจงสิ่งที่อยู่ใน `protected $supportedInterfaceOrClass` หากเหมือนกัน พารามิเตอร์อื่นใดหากไม่ใช่ลำดับความสำคัญหรือรูปแบบที่เลือกว่าควรใช้ Normalizer ตัวใด
Score:1
ธง in

พบคำตอบที่ใช้งานได้พร้อมคำแนะนำที่เป็นประโยชน์จากความคิดเห็นที่นี่ กุญแจสำคัญคือในทั้งสองคลาส Normalizer ฉันไม่ได้ใช้ไฟล์ รองรับการปรับให้เป็นมาตรฐาน การทำงาน

 /**
 * ตรวจสอบว่าคลาสที่กำหนดรองรับการทำให้เป็นมาตรฐานโดย Normalizer นี้หรือไม่
 */
   ฟังก์ชั่นสาธารณะรองรับการทำให้เป็นมาตรฐาน ($data, $format = NULL) {
      ถ้า (!is_object($data) || !$this->checkFormat($format)) {
        กลับ FALSE;
      }
      ถ้า (อินสแตนซ์ $data ของ NodeInterface && $data->getType() == 'myContentType') {
        กลับ TRUE;
      }
        กลับ FALSE;
      }
    }

ด้วยฟังก์ชันข้างต้น ฉันยังคงสามารถจัดลำดับความสำคัญของตัวปรับมาตรฐานทั้งสองตัวใน services.yml ให้เป็นค่าเดียวกันได้ (เช่น '10') มันจะเริ่มทำงานสำหรับทั้งสองตัว แต่จะส่งคืนค่าเท็จหากไม่ตรงกับเนื้อหาเฉพาะ พิมพ์.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา