Рейтинг:0

Как использовать DependencySerializationTrait?

флаг br

Я на Drupal 9. Пытаюсь редактировать ProductVariationAccessControlHandler класс коммерции.

Класс расширяется Drupal\Core\Entity\EntityAccessControlHandler который, в свою очередь, расширяет абстрактный класс EntityHandlerBase

Этот абстрактный класс использует DependencySerializationTrait черта.

Теперь я хочу внедрить новый сервис внутри ProductVariationAccessControlHandler. Родительский класс имеет __конструкт метод:

  /**
   * Создает экземпляр обработчика управления доступом.
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   * Определение типа объекта.
   */
  общедоступная функция __construct (EntityTypeInterface $entity_type) {
    $this->entityTypeId = $entity_type->id();
    $this->entityType = $entity_type;
  }

Я искал, но не нашел документации и не понял, как использовать эту «черту» для внедрения другой службы, например. entity_type.manager.

Рейтинг: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('Вызов ' . __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;
  }
Рейтинг:1
флаг us

DependencySerializationTrait используется, чтобы избежать полной сериализации службы, содержащейся в свойстве класса, при сериализации этого экземпляра класса. Вместо этого идентификатор службы сериализуется внутри экземпляра класса.

DependencySerializationTrait не используется для добавления зависимостей к классу, использующему внедрение зависимостей. Если вы редактируете существующий класс обработчика управления доступом (что неправильно делать, когда класс реализован ядром Drupal или вспомогательным модулем, размещенным на drupal.org) для добавления дополнительных зависимостей, вам следует отредактировать его создать экземпляр () метод, если он существует, или добавьте его. Например, Рабочий процессAccessControlHandler class использует следующий код для внедрения необходимых ему зависимостей.

  /**
   * {@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(). Например, для объекта Node я мог бы использовать следующий код.

function book_entity_type_build (массив и $entity_types) {
  /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
  $entity_types['node']->setAccessClass('Drupal\mymodule\Access\ExtendedNodeAccessControlHandler');
}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.