Điểm:0

Cách sử dụng DependencySerializationTrait?

lá cờ br

Tôi đang dùng Drupal 9. Tôi đang cố chỉnh sửa ProductVariationAccessControlHandler lớp Thương mại.

Lớp học mở rộng Drupal\Core\Entity\EntityAccessControlHandler đến lượt nó mở rộng lớp trừu tượng EntityHandlerBase

Lớp trừu tượng này sử dụng DependencySerializationTrait đặc điểm.

Bây giờ, tôi muốn đưa một dịch vụ mới vào bên trong ProductVariationAccessControlHandler. Lớp cha có một __xây dựng phương pháp:

  /**
   * Xây dựng một phiên bản xử lý kiểm soát truy cập.
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   * Định nghĩa kiểu thực thể.
   */
  hàm công khai __construct(EntityTypeInterface $entity_type) {
    $this->entityTypeId = $entity_type->id();
    $this->entityType = $entity_type;
  }

Tôi đã tìm kiếm, nhưng không tìm thấy tài liệu nào cũng như không hiểu cách sử dụng "đặc điểm" đó để đưa vào một dịch vụ khác - ví dụ: entity_type.manager.

Điểm:1
lá cờ us

DependencySerializationTrait được sử dụng để tránh việc dịch vụ chứa trong thuộc tính lớp được tuần tự hóa hoàn toàn khi thể hiện của lớp đó được tuần tự hóa. Thay vào đó, mã định danh dịch vụ được tuần tự hóa trong thể hiện của lớp.

DependencySerializationTrait không được sử dụng để thêm các phụ thuộc vào một lớp sử dụng tính năng Tiêm phụ thuộc. Nếu bạn đang chỉnh sửa một lớp trình xử lý kiểm soát truy cập hiện có (đây không phải là điều nên làm khi lớp này được triển khai bởi lõi Drupal hoặc một mô-đun đóng góp được lưu trữ trên drupal.org) để thêm các phần phụ thuộc khác, thì bạn nên chỉnh sửa lớp đó. tạoInstance() phương pháp, nếu nó tồn tại, hoặc thêm nó. Ví dụ, các WorkflowAccessControlHandler class sử dụng đoạn mã sau để thêm các phụ thuộc mà nó cần.

  /**
   * {@inheritdoc}
   */
  hàm tĩnh công cộng createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
    trả lại tĩnh mới($entity_type, $container
      ->get('plugin.manager.workflows.type'));
  }

  /**
   * Xây dựng phiên bản trình xử lý kiểm soát truy cập quy trình làm việc.
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   * Định nghĩa kiểu thực thể.
   * @param \Drupal\Component\Plugin\PluginManagerInterface $workflow_type_manager
   * Trình quản lý plugin loại quy trình làm việc.
   */
  chức năng công khai __construct(EntityTypeInterface $entity_type, PluginManagerInterface $workflow_type_manager) {
    cha mẹ::__construct($entity_type);
    $this->workflowTypeManager = $workflow_type_manager;
  }

Cách chính xác để thay đổi trình xử lý kiểm soát truy cập được sử dụng bởi một thực thể đang triển khai hook_entity_type_build() và thay đổi trình xử lý kiểm soát truy cập bằng EntityTypeInterface::setAccessClass(). Ví dụ: đối với thực thể Nút, tôi có thể sử dụng đoạn mã sau.

hàm book_entity_type_build(mảng &$entity_types) {
  /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
  $entity_types['node']->setAccessClass('Drupal\mymodule\Access\ExtendedNodeAccessControlHandler');
}
Điểm:1
lá cờ cn

Đặc điểm này không liên quan gì đến việc tiêm một dịch vụ khác, xem Khi nào tôi nên sử dụng DependencySerializationTrait?

Cách cơ bản để thêm một dịch vụ khác là ghi đè __construct:

  hàm công khai __construct(EntityTypeInterface $entity_type, EntityTypeManagerInterface $entity_type_manager) {
    cha mẹ::__construct($entity_type);
    $this->entityTypeManager = $entity_type_manager;
  }

Bạn cần phải cẩn thận, mặc dù. Các mô-đun có thể coi phương thức này là nội bộ và khi chúng quyết định tự đưa vào một dịch vụ khác, điều này sẽ phá vỡ mã của người khác. Phương pháp hay nhất cho các mô-đun là cung cấp dự phòng với thông báo không dùng nữa trong những trường hợp như vậy. Xem hồ sơ thay đổi này Hàm tạo NodeAccessControlHandler và MediaAccessControlHandler thêm đối số $entity_type_manager và phương thức __construct:

  hàm công khai __construct(EntityTypeInterface $entity_type, EntityTypeManagerInterface $entity_type_manager = NULL) {
    cha mẹ::__construct($entity_type);
    if (!isset($entity_type_manager)) {
      @trigger_error('Gọi ' . __METHOD__ . '() không có đối số $entity_type_manager không được dùng trong drupal:9.3.0 và sẽ được yêu cầu trong drupal:10.0.0. Xem https://www.drupal.org/node/3214171 ', E_USER_DEPRECATED);
      $entity_type_manager = \Drupal::entityTypeManager();
    }
    $this->entityTypeManager = $entity_type_manager;
  }

Đă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.