Puncte:0

Cum se utilizează DependencySerializationTrait?

drapel br

Sunt pe Drupal 9. Încerc să editez ProductVariationAccessControlHandler clasa Comertului.

Clasa se extinde Drupal\Core\Entity\EntityAccessControlHandler care la rândul său extinde clasa abstractă EntityHandlerBase

Această clasă abstractă folosește DependencySerializationTrait trăsătură.

Acum, vreau să injectez un nou serviciu în interior ProductVariationAccessControlHandler. Clasa părinte are a __construi metodă:

  /**
   * Construiește o instanță de gestionare a controlului accesului.
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   * Definiția tipului de entitate.
   */
  funcția publică __construct(EntityTypeInterface $entity_type) {
    $this->entityTypeId = $entity_type->id();
    $this->entityType = $entity_type;
  }

Am căutat, dar nu am găsit documentație și nici nu am înțeles care este modalitatea de a folosi acea „trăsătură” pentru a injecta un alt serviciu - de ex. tip_entitate.manager.

Puncte:1
drapel cn

Această trăsătură nu are nimic de-a face cu injectarea unui alt serviciu, vezi Când ar trebui să folosesc DependencySerializationTrait?

Modul de bază de a injecta un alt serviciu este suprascrierea __construct:

  funcția publică __construct(EntityTypeInterface $entity_type, EntityTypeManagerInterface $entity_type_manager) {
    parent::__construct($entity_type);
    $this->entityTypeManager = $entity_type_manager;
  }

Trebuie să fii atent, totuși. Modulele ar putea considera metoda ca fiind internă și atunci când decid să injecteze un alt serviciu, acest lucru va sparge codul altora. Cea mai bună practică pentru module este de a oferi o rezervă cu un mesaj de depreciere în astfel de cazuri. Vedeți această înregistrare a modificărilor Constructorul NodeAccessControlHandler și MediaAccessControlHandler adaugă un argument $entity_type_manager și metoda __construct:

  funcția publică __construct(EntityTypeInterface $entity_type, EntityTypeManagerInterface $entity_type_manager = NULL) {
    parent::__construct($entity_type);
    dacă (!isset($entity_type_manager)) {
      @trigger_error('Apelarea ' . __METHOD__ . '() fără argumentul $entity_type_manager este depreciat în drupal:9.3.0 și va fi necesar în drupal:10.0.0. Consultați https://www.drupal.org/node/3214171 ', E_USER_DEPRECATED);
      $entity_type_manager = \Drupal::entityTypeManager();
    }
    $this->entityTypeManager = $entity_type_manager;
  }
Puncte:1
drapel us

DependencySerializationTrait este folosit pentru a evita ca un serviciu conținut într-o proprietate de clasă să fie complet serializat atunci când acea instanță de clasă este serializată. În schimb, identificatorul de serviciu este serializat în instanța clasei.

DependencySerializationTrait nu este folosit pentru a adăuga dependențe la o clasă care utilizează Dependency Injection. Dacă editați o clasă existentă de gestionare a controlului accesului (ceea ce nu este lucrul corect de făcut atunci când clasa este implementată de nucleul Drupal sau de un modul contribuit găzduit pe drupal.org) pentru a adăuga mai multe dependențe, ar trebui să-i editați createInstance() metoda, dacă există, sau adăugați-o. De exemplu, cel WorkflowAccessControlHandler clasa folosește următorul cod, pentru a injecta dependențele de care are nevoie.

  /**
   * {@inheritdoc}
   */
  funcția publică statică createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
    returnează static nou ($entity_type, $container
      ->get('plugin.manager.workflows.type'));
  }

  /**
   * Construiește instanța de gestionare a controlului accesului fluxului de lucru.
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   * Definiția tipului de entitate.
   * @param \Drupal\Component\Plugin\PluginManagerInterface $workflow_type_manager
   * Managerul de plugin de tip flux de lucru.
   */
  funcția publică __construct(EntityTypeInterface $entity_type, PluginManagerInterface $workflow_type_manager) {
    parent::__construct($entity_type);
    $this->workflowTypeManager = $workflow_type_manager;
  }

Modul corect de a modifica un handler de control al accesului utilizat de o entitate este implementarea hook_entity_type_build() și schimbați handlerul de control al accesului cu EntityTypeInterface::setAccessClass(). De exemplu, pentru entitatea Node, aș putea folosi următorul cod.

funcția book_entity_type_build(array &$entity_types) {
  /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
  $entity_types['node']->setAccessClass('Drupal\mymodule\Access\ExtendedNodeAccessControlHandler');
}

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.