Рейтинг:-1

Внедрение зависимостей в метод create() блочного плагина с производными

флаг us

Я пытаюсь расширить menu_block модуль, позволяющий ему работать с доменами (через домен модуль). Для этого я расширяю МенюБлок класс и пытается получить доступ к домен.переговорщик обслуживание изнутри получить производный идентификатор (). я использую Создайте() способ внедрить сервис и сохранить его в $domainПереговорщик имущество следующим образом:

  общедоступная статическая функция create(ContainerInterface $container, массив $configuration, $plugin_id, $plugin_definition) {
    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->domainNegotiator = $container->get('domain.negotiator');
    вернуть $экземпляр;
  }

Когда я пытаюсь позвонить $this->domainNegotiator изнутри получить производный идентификатор () Я получаю сообщение об ошибке, в котором говорится, что свойство не существует, и поэтому я не могу получить доступ к его методам. При отладке я смог отследить проблему до MenuBlock::defaultConfiguration() вызов $this->getDerivativeID().

Конфигурация по умолчанию установлена ​​в __конструкт() внутри BlockPluginTrait (называется в БлокБейс), так что в конечном итоге это сводится к тому, что меня вызывают в моем классе Создайте() метод.

Я могу обойти эту проблему, используя не внедренную версию службы в моем получить производный идентификатор () метод, однако это не очень хорошая практика:

$active_domain = \Drupal::service('domain.negotiator')->getActiveDomain();

Есть ли способ внедрить зависимости, чтобы они были доступны перед вызовом родитель::создать() в моем классе Создайте() метод?

флаг cn
Проще всего, вероятно, было бы сделать то, что делает ядро, когда оно не уверено, была ли введена служба, например. [`ControllerBase::entityTypeManager()`](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Controller%21ControllerBase.php/function/ControllerBase%3A%3AentityTypeManager/9.3.x )
Рейтинг:3
флаг cn

Система плагинов Drupal имеет четыре уровня. Определение плагина, производные, конфигурация и, наконец, экземпляр во время выполнения.

Как вы можете видеть в своем сообщении об ошибке, вы настраиваете конкретное определение плагина или производное от определения плагина. Это определение является статическим, и вы не можете изменить его после настройки.

Только экземпляр подключаемого модуля во время выполнения может реагировать на динамические условия, такие как активный домен.

Рейтинг:1
флаг us

Я не мог понять, как расширить МенюБлок используя только Создайте(). Я должен был измениться на __конструкт() и Создайте() систему и вернулся статический() изнутри Создайте() при ручном вводе зависимостей из обоих МенюБлок и СистемаМенюБлок классы. Это немного менее надежно, поскольку оно сломается, если МенюБлок класс когда-либо изменяет зависимости, однако он по-прежнему выполняет предполагаемое поведение использования внедренной зависимости внутри получить производный идентификатор ():

  общедоступная функция __construct (конфигурация массива $, $ plugin_id, $ plugin_definition, MenuLinkTreeInterface $ menu_tree, MenuActiveTrailInterface $ menu_active_trail, MenuParentFormSelectorInterface $ menu_parent_form_selector, EntityTypeManagerInterface $entity_type_manager, DomainNegotiatorInterface $domain_negotiator) {
    $this->domainNegotiator = $domain_negotiator;
    $this->menuParentFormSelector = $menu_parent_form_selector;
    $this->entityTypeManager = $entity_type_manager;
    parent::__construct($configuration, $plugin_id, $plugin_definition, $menu_tree, $menu_active_trail);
  }

  общедоступная статическая функция create(ContainerInterface $container, массив $configuration, $plugin_id, $plugin_definition) {
    вернуть новую статику(
      $ конфигурация,
      $plugin_id,
      $plugin_definition,
      $container->получить('menu.link_tree'),
      $container->получить('menu.active_trail'),
      $container->получить('menu.parent_form_selector'),
      $container->получить('entity_type.manager'),
      $container->get('domain.negotiator'));
  }

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

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