Puncte:1

Cum pot injecta dependențe în funcție de condiții?

drapel cn

Creez un formular personalizat și în acest formular trebuie să folosesc un serviciu care există într-un alt modul. Trebuie să folosesc acea injecție de dependență pe baza condițiilor care sunt acolo în configurație.

Condiții în forma de configurare:

  1. Utilizați formularul personalizat1
  2. Utilizați formularul Custom2

Dacă âUse Custom1 Formâ este activat, atunci trebuie să folosesc injecția de dependență.

spațiu de nume Drupal\test\Form;

utilizați Drupal\Core\Form\ConfigFormBase;
utilizați Drupal\Core\Form\FormStateInterface;
utilizați Symphony\Component\DependencyInjection\ContainerInterface;
utilizați Drupal\custom_form1\Services\TestService;

/**
 * Formulare de testare.
 */
clasa TestForm extinde ConfigFormBase {

  /**
   * Obiectul PinCodeRegistration.
   *
   * @var Drupal\custom_form1\Services\TestService;
   */
  protejat $TestService;

  /**
   * Construiește o nouă formă de cod PIN în mai mulți pași.
   *
   * @param Drupal\custom_form1\Services\TestService $test_service
   * Operatorul de service.
   */
  funcția publică __construct(Serviciul de testare $serviciul_testului) {
    $this->TestService = $test_service;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică statică create(ContainerInterface $container) {
    returnează static nou (
      $container->get('custom_form1.form1_services')
    );
  }
}

Cum pot adăuga utilizați Drupal\custom_form1\Services\TestService; bazat pe conditii?

Dacă formular_personalizat1 Modulul nu este instalat, primesc o eroare. Aveți idee cum trebuie să evităm erorile și dependența adăugată în funcție de condiții?

Puncte:3
drapel de

Dependențele nu pot fi adăugate condiționat pe baza funcționalității din cadrul clasei, deoarece injectarea are loc în timpul instanțierii clasei și este deja completă înainte ca metodele clasei să poată fi apelate. În schimb, injectați ambele servicii și utilizați oricare dintre ele de care aveți nevoie atunci când aveți nevoie.Sau puteți apela serviciul de care aveți nevoie utilizând static \Drupal::service() atunci când aveți nevoie de el, deși este de preferat să utilizați injecția de dependență atunci când este în contextul clasei decât apelarea serviciilor static.

sonfd avatar
drapel in
Exact. Și într-o situație în care trebuie să utilizați un serviciu dintr-un modul care nu este o dependență gravă a modulului dvs., adică modulul poate să nu fie instalat, este perfect acceptabil să nu utilizați injecția de dependență.
Puncte:1
drapel us

Întrebarea nu o face explicită, dar deoarece întrebarea menționează obținerea unei erori atunci când un alt modul nu este instalat, înțeleg că conditia este când modulul este instalat. În acest caz, modulul poate folosi pur și simplu următorul cod.

funcția publică __construct(Serviciul de testare $serviciul_testului = NULL) {
  $this->testService = $test_service;
}

funcția publică statică create(ContainerInterface $container) {
  returnează static nou (
    $container->has('custom_form1.form1_services') ? $container->get('custom_form1.form1_services'): NULL
  );
}

În acest caz, clasa din modulul dumneavoastră ar trebui să fie pregătită să nu primească nicio instanță de clasă. Alternativ, modulul dumneavoastră ar putea implementa o versiune simplificată a serviciului, care implementează aceeași interfață și să folosească cod similar cu următorul.

funcția publică __construct(TestServiceInterface $test_service = NULL) {
  $this->testService = $test_service;
}

funcția publică statică create(ContainerInterface $container) {
  returnează static nou (
    $container->has('custom_form1.form1_services') ? $container->get('custom_form1.form1_services'): $container->get('mymodule.form1_services')
  );
}

Aceasta presupuneTestService implementează o interfață care poate fi implementată din serviciul simplificat. (De asemenea, presupune că este posibil să se implementeze un serviciu simplificat.)

RaMeSh avatar
drapel cn
În acest caz, nu este nevoie să adăugăm „utilizați Drupal\custom_form1\Services\TestService;” în dosarul nostru?
apaderno avatar
drapel us
Este de preferat să-l folosiți pentru interfață, dacă există. Da, ai nevoie. PHP nu verifică existența clasei când se folosește `use Drupal\custom_form1\Services\TestService;`, ci când este utilizată instanța clasei.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.