Score:0

ใช้ DependencySerializationTrait อย่างไร

ธง br

ฉันใช้ Drupal 9 ฉันกำลังพยายามแก้ไข ProductVariationAccessControlHandler ชั้นพาณิชย์.

ชั้นเรียนขยายออกไป Drupal\Core\Entity\EntityAccessControlHandler ซึ่งจะขยายชั้นเรียนนามธรรม EntityHandlerBase

คลาสนามธรรมนี้ใช้ การพึ่งพาการทำให้เป็นอนุกรมลักษณะ ลักษณะ

ตอนนี้ต้องการอัดฉีดภายในใหม่ครับ ProductVariationAccessControlHandler. คลาสพาเรนต์มี a __สร้าง กระบวนการ:

  /**
   * สร้างอินสแตนซ์ตัวจัดการการควบคุมการเข้าถึง
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   * คำจำกัดความประเภทเอนทิตี
   */
  ฟังก์ชั่นสาธารณะ __construct (EntityTypeInterface $entity_type) {
    $this->entityTypeId = $entity_type->id();
    $this->entityType = $entity_type;
  }

ฉันค้นหาแล้ว แต่ไม่พบเอกสารและไม่เข้าใจว่าจะใช้ "ลักษณะ" นั้นอย่างไรเพื่อฉีดบริการอื่น - เช่น entity_type.manager.

Score:1
ธง cn

ลักษณะนี้ไม่มีส่วนเกี่ยวข้องกับการฉีดบริการอื่น ดู เมื่อใดที่ฉันควรใช้ DependencySerializationTrait

วิธีพื้นฐานในการฉีดบริการอื่นคือการเอาชนะ __construct:

  ฟังก์ชั่นสาธารณะ __construct (EntityTypeInterface $entity_type, EntityTypeManagerInterface $entity_type_manager) {
    พาเรนต์::__construct($entity_type);
    $this->entityTypeManager = $entity_type_manager;
  }

คุณต้องระวังแม้ว่า โมดูลอาจพิจารณาว่าวิธีการนี้เป็นวิธีการภายในและเมื่อพวกเขาตัดสินใจที่จะแทรกบริการอื่นด้วยตนเอง สิ่งนี้จะทำให้โค้ดอื่นเสียหาย แนวทางปฏิบัติที่ดีที่สุดสำหรับโมดูลคือการให้ทางเลือกพร้อมข้อความเลิกใช้งานในกรณีดังกล่าว ดูบันทึกการเปลี่ยนแปลงนี้ ตัวสร้าง NodeAccessControlHandler และ MediaAccessControlHandler เพิ่มอาร์กิวเมนต์ $entity_type_manager และวิธีการ __construct:

  ฟังก์ชันสาธารณะ __construct (EntityTypeInterface $entity_type, EntityTypeManagerInterface $entity_type_manager = NULL) {
    พาเรนต์::__construct($entity_type);
    ถ้า (!isset($entity_type_manager)) {
      @trigger_error('Calling ' . __METHOD__ . '() โดยไม่มี $entity_type_manager อาร์กิวเมนต์จะเลิกใช้ใน drupal:9.3.0 และจะต้องใช้ใน drupal:10.0.0 ดู https://www.drupal.org/node/3214171 ', E_USER_DEPRECATED);
      $entity_type_manager = \Drupal::entityTypeManager();
    }
    $this->entityTypeManager = $entity_type_manager;
  }
Score:1
ธง us

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

การพึ่งพาการทำให้เป็นอนุกรมลักษณะ ไม่ได้ใช้เพื่อเพิ่มการพึ่งพาไปยังคลาสที่ใช้การพึ่งพาการฉีด หากคุณกำลังแก้ไขคลาสตัวจัดการการควบคุมการเข้าถึงที่มีอยู่ (ซึ่งไม่ใช่สิ่งที่ถูกต้องที่ต้องทำเมื่อคลาสนั้นใช้งานโดย Drupal core หรือโมดูลที่สนับสนุนซึ่งโฮสต์บน drupal.org) เพื่อเพิ่มการพึ่งพา คุณควรแก้ไข สร้างอินสแตนซ์ () วิธีการถ้ามีหรือเพิ่ม ตัวอย่างเช่น, เวิร์กโฟลว์ AccessControlHandler คลาสใช้รหัสต่อไปนี้เพื่อแทรกการอ้างอิงที่ต้องการ

  /**
   * {@inheritdoc}
   */
  ฟังก์ชันสแตติกสาธารณะ createInstance (ContainerInterface $container, EntityTypeInterface $entity_type) {
    ส่งคืนค่าคงที่ใหม่ ($entity_type, $container
      ->get('plugin.manager.workflows.type'));
  }

  /**
   * สร้างอินสแตนซ์ของตัวจัดการการควบคุมการเข้าถึงเวิร์กโฟลว์
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   * คำจำกัดความประเภทเอนทิตี
   * @param \Drupal\Component\Plugin\PluginManagerInterface $workflow_type_manager
   * ตัวจัดการปลั๊กอินประเภทเวิร์กโฟลว์
   */
  ฟังก์ชันสาธารณะ __construct (EntityTypeInterface $entity_type, PluginManagerInterface $workflow_type_manager) {
    พาเรนต์::__construct($entity_type);
    $this->workflowTypeManager = $workflow_type_manager;
  }

กำลังดำเนินการวิธีที่ถูกต้องในการปรับเปลี่ยนตัวจัดการการควบคุมการเข้าถึงที่ใช้โดยเอนทิตี hook_entity_type_build() และเปลี่ยนตัวจัดการการควบคุมการเข้าถึงด้วย EntityTypeInterface::setAccessClass(). ตัวอย่างเช่น สำหรับโหนดเอนทิตี ฉันสามารถใช้รหัสต่อไปนี้

ฟังก์ชัน book_entity_type_build (อาร์เรย์ &$entity_types) {
  /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
  $entity_types['node']->setAccessClass('Drupal\mymodule\Access\ExtendedNodeAccessControlHandler');
}

โพสต์คำตอบ

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