Рейтинг:1

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

флаг cn

Я создаю одну пользовательскую форму, и в этой форме мне нужно использовать одну службу, которая находится в другом модуле. Мне нужно использовать эту инъекцию зависимостей на основе условий, которые есть в конфигурации.

Условия в форме конфигурации:

  1. Использовать форму Custom1
  2. Использовать форму Custom2

Если «Использовать форму Custom1» включено, мне нужно использовать внедрение зависимостей.

пространство имен Drupal\test\Form;

используйте Drupal\Core\Form\ConfigFormBase;
используйте Drupal\Core\Form\FormStateInterface;
используйте Symphony\Component\DependencyInjection\ContainerInterface;
используйте Drupal\custom_form1\Services\TestService;

/**
 * Тестовые формы.
 */
класс TestForm расширяет ConfigFormBase {

  /**
   * Объект PinCodeRegistration.
   *
   * @var Drupal\custom_form1\Services\TestService;
   */
  защищенный $TestService;

  /**
   * Создает новую многоступенчатую форму пин-кода.
   *
   * @param Drupal\custom_form1\Services\TestService $test_service
   * Обработчик службы.
   */
  общедоступная функция __construct (TestService $ test_service) {
    $this->TestService = $test_service;
  }

  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция create(ContainerInterface $container) {
    вернуть новую статику(
      $container->получить('custom_form1.form1_services')
    );
  }
}

Как я могу добавить используйте Drupal\custom_form1\Services\TestService; исходя из условий?

Если custom_form1 модуль не установлен, я получаю сообщение об ошибке. Любая идея, как нам нужно избегать ошибок и добавленной зависимости в зависимости от условий?

Рейтинг:3
флаг de

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

sonfd avatar
флаг in
Точно. И в ситуации, когда вам нужно использовать сервис из модуля, который не является жесткой зависимостью вашего модуля, т.е. модуль может быть не установлен, вполне допустимо не использовать внедрение зависимостей.
Рейтинг:1
флаг us

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

общедоступная функция __construct (TestService $ test_service = NULL) {
  $this->testService = $test_service;
}

общедоступная статическая функция create(ContainerInterface $container) {
  вернуть новую статику(
    $container->has('custom_form1.form1_services')? $container->get('custom_form1.form1_services'): NULL
  );
}

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

общедоступная функция __construct (TestServiceInterface $ test_service = NULL) {
  $this->testService = $test_service;
}

общедоступная статическая функция create(ContainerInterface $container) {
  вернуть новую статику(
    $container->has('custom_form1.form1_services')? $container->get('custom_form1.form1_services'): $container->get('mymodule.form1_services')
  );
}

Это предполагаетТестСервис реализует интерфейс, который можно реализовать из упрощенной службы. (Также предполагается, что можно реализовать упрощенный сервис.)

RaMeSh avatar
флаг cn
В этом случае нам не нужно добавлять «use Drupal\custom_form1\Services\TestService;» в нашем файле?
apaderno avatar
флаг us
Желательно использовать его для интерфейса, если он есть. Да, вам это нужно. PHP не проверяет существование класса, когда используется `use Drupal\custom_form1\Services\TestService;`, но когда используется экземпляр класса.

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

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