Puncte:-1

Injectarea de dependență în metoda create() a pluginului bloc cu derivate

drapel us

Încerc să extind meniu_bloc modul pentru a-i permite să lucreze cu domenii (prin intermediul domeniu modul). Pentru a face acest lucru, extind MenuBlock clasa și încercând să acceseze domeniu.negociator serviciu din interior getDerivativeID(). Eu folosesc crea() metoda de a injecta serviciul și de a-l stoca la a $domainNegotiator proprietate după cum urmează:

  funcția publică statică create(ContainerInterface $container, matrice $configurație, $plugin_id, $plugin_definition) {
    $instanta = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->domainNegotiator = $container->get('domain.negotiator');
    returnare $instanță;
  }

Când încerc să sun $this->domainNegotiator din cadrul getDerivativeID() Primesc o eroare care afirmă că proprietatea nu există și, prin urmare, nu pot accesa metode de pe ea. În depanare, am putut urmări problema până la MenuBlock::defaultConfiguration() chemând $this->getDerivativeID().

Configurația implicită este setată __construi() interior BlockPluginTrait (a sunat BlockBase), așa că în cele din urmă se reduce la a fi chemat în clasa mea crea() metodă.

Pot să rezolv această problemă utilizând o versiune neinjectată a serviciului în mine getDerivativeID() metoda, cu toate acestea, aceasta nu este o practică grozavă:

$domeniu_activ = \Drupal::service('domeniu.negotiator')->getActiveDomain();

Există o modalitate de a injecta dependențe, astfel încât acestea să fie disponibile înainte de a suna parent::create() în clasa mea crea() metodă?

drapel cn
Cel mai simplu ar fi probabil să faci ceea ce face core atunci când nu este sigur dacă un serviciu a fost injectat, de ex. [`ControllerBase::entityTypeManager()`](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Controller%21ControllerBase.php/function/ControllerBase%3A%3AentityTypeManager/9.3.x )
Puncte:3
drapel cn

Sistemul de plugin Drupal are patru niveluri. Definirea pluginului, derivatele, configurarea și în final instanța de rulare.

După cum puteți vedea în mesajul dvs. de eroare, configurați o anumită definiție de plugin sau un derivat al definiției pluginului. Această definiție este statică și nu o puteți modifica după ce ați configurat-o.

Doar instanța de rulare a pluginului poate reacționa în condiții dinamice, cum ar fi domeniul activ.

Puncte:1
drapel us

Nu am putut să-mi dau seama cum să prelungesc MenuBlock folosind numai crea(). A trebuit să mă schimb la a __construi() și crea() sistem și a revenit static() din cadrul crea() în timp ce injectați manual dependențele din ambele MenuBlock și SystemMenuBlock clase. Acesta este puțin mai puțin robust, deoarece se va rupe dacă MenuBlock clasa modifică vreodată dependențele, totuși încă realizează comportamentul intenționat de a folosi o dependență injectată în interior getDerivitiveId():

  funcția publică __construct(array $configuration, $plugin_id, $plugin_definition, MenuLinkTreeInterface $menu_tree, MenuActiveTrailInterface $menu_active_trail, MenuParentFormSelectorInterface $menu_parent_form_selector, EntityTypeManagerInterface $entity_dogo_manager_manager)
    $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);
  }

  funcția publică statică create(ContainerInterface $container, matrice $configurație, $plugin_id, $plugin_definition) {
    returnează static nou (
      $configurare,
      $plugin_id,
      $plugin_definition,
      $container->get('menu.link_tree'),
      $container->get('menu.active_trail'),
      $container->get('menu.parent_form_selector'),
      $container->get('entity_type.manager'),
      $container->get('domeniu.negotiator'));
  }

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.