Рейтинг:0

Как использовать методы из класса сущностей, если у него нет такого сервиса?

флаг ng

Я пишу EventSubscriber для объекта конфигурации модуля домена. Моя цель вставить некоторые данные в его конфиг по событию preSave (это делается из патча для D9).

Вот мой код из класса ConfigEventSubscriber моего пользовательского модуля:


пространство имен Drupal\custom_module\EventSubscriber;

используйте Drupal\Core\Config\ConfigCrudEvent;
используйте Drupal\Core\Config\ConfigEvents;
используйте Drupal\domain\Entity\Domain;
используйте Symfony\Component\EventDispatcher\EventSubscriberInterface;

 класс ConfigEventSubscriber реализует EventSubscriberInterface {

   публичная функция __construct (домен $ домен) {
     $это->домен = $домен;
   }
   /**
   * {@inheritdoc}
   *
   * @возвратный массив
   * Имена событий для прослушивания и методы, которые должны выполняться.
   */
  общедоступная статическая функция getSubscribedEvents() {
    возвращаться [
      ConfigEvents::PRESAVE => 'configPreSave'
    ];
  }

  /**
   * Реагировать на сохранение объекта конфигурации.
   *
   * @param \Drupal\Core\Config\ConfigCrudEvent $event
   * Конфигурация сырого события.
   */
  общедоступная функция configPreSave (ConfigCrudEvent $event) {
    $config = $event->getConfig();
    $domain_id = $config->getOriginal('id');
    if ($config->getStorage()->listAll('domain.record.')) {
      $this->domain->addDependencyTrait('module', 'country_path');
      $this->domain->setThirdPartySetting('путь_страны', 'путь_домена', $domain_id);
    }
  }
 }

Вот мой файл services.yml:

Сервисы:
  Drupal\пользовательский_модуль\EventSubscriber\ConfigEventSubscriber:
    теги:
      - {имя: 'event_subscriber'}
    аргументы: ['@domain.element_manager']

Он выдает ошибку, которую дал экземпляр DomainElementManager, но ожидается объект домена, и это логично, поскольку я включаю экземпляр домена $domain в свою конструкцию. Но мне нужен класс домена для использования этих методов:

addDependency, setThirdPartySettings.

Итак, мой вопрос, как правильно использовать эти методы в контексте моей задачи?

Любая помощь приветствуется.

beltouche avatar
флаг cn
Если вы не можете получить Домен напрямую как услугу, можете ли вы получить ее от существующей услуги? Например, если у менеджера домена есть метод getDomain(), вы можете переписать свой класс, чтобы внедрить менеджер и извлечь домен в конструкторе.
Yaroslav avatar
флаг ng
К сожалению, у него нет такого метода. Этот метод есть в DomainAliasInterface, но он также не объявлен в services.yml его модуля.
4uk4 avatar
флаг cn
Даже если у вас нет методов полностью загруженного объекта домена, вы все равно сможете получить и установить все параметры конфигурации, а также параметры сторонних разработчиков: `$config->get(' Third_party_settings')`
Yaroslav avatar
флаг ng
Спасибо, это мне очень помогло. Я использовал метод $config->set() и отправил необходимые данные.

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

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