Puncte:0

Cum să evitați conflicte de servicii personalizate similare?

drapel in

Am două module, fiecare dintre ele definește un serviciu de normalizare

module_one.services.yml

Servicii:
  module_one.normalizer.node_entity:
    clasa: Drupal\module_one\Normalizer\ModuleOneEntityNormalizer
    argumente: ['@entity_type.manager']
    Etichete:
      - { nume: normalizator, prioritate: 10 }

module_two.services.yml

Servicii:
  module_two.normalizer.node_entity:
    clasa: Drupal\module_two\Normalizer\ModuleTwoEntityNormalizer
    argumente: ['@entity_type.manager']
    Etichete:
      - { nume: normalizator, prioritate: 10 }

Pentru fiecare modul, creez un normalizator distinct și, probabil, definesc un spațiu de nume separat, de exemplu:

<?php

spațiu de nume Drupal\module_one\Normalizer;

utilizați Drupal\Core\Entity\EntityTypeManagerInterface;
utilizați Drupal\serialization\Normalizer\ContentEntityNormalizer;
utilizați Drupal\node\NodeInterface;

/**
 * Convertește structurile obiectului entității Drupal într-o matrice normalizată.
 */
clasa ModuleOneEntityNormalizer extinde ContentEntityNormalizer {
...

Problema este că, cu ambele module activate, un serviciu îl blochează pe celălalt - serializatorul/normalizatorul se declanșează așa cum era de așteptat pentru primul, dar nu pentru al doilea. Singura modalitate de a face ca celălalt să fie recunoscut este de a-i crește prioritatea, dar asta îl blochează pe primul.

Ce îmi lipsește din definițiile care ar împiedica aceste două servicii să intre în conflict unul cu celălalt?

Actualizați: Mulțumesc pentru comentariile cu adevărat utile, începând să apelezi la asta. Ambii normalizatori au aceeași $supportedInterface protejată, de exemplu:

  /**
   * Interfața sau clasa pe care o acceptă acest Normalizator.
   *
   * @var șir
   */
  protejat $supportedInterfaceOrClass = [
    „Drupal\node\NodeInterface”
  ];

Care este semnalat în Manualul Drupal Serialization API ca o problemă

Kevin avatar
drapel in
De ce să nu schimbați prioritatea și apoi să îi ajustați regulile de selecție în ceea ce privește momentul în care este aplicabilă? https://api.drupal.org/api/drupal/core%21modules%21serialization%21src%21Normalizer%21NormalizerBase.php/function/NormalizerBase%3A%3AsupportsNormalization/9.2.x dacă operează pe aceleași tipuri exacte de entități fără diferențe condiționate, probabil că trebuie să adăugați informații de context atunci când serializați.
drapel ru
Sau poate un [serviciu de decorator](https://symfony.com/doc/current/service_container/service_decoration.html)
4uk4 avatar
drapel cn
Trebuie să clarificați ce este în `protected $supportedInterfaceOrClass`. Dacă este același, ce alt parametru, dacă nu prioritatea sau formatul selectează ce normalizator trebuie utilizat?
Puncte:1
drapel in

Am găsit un răspuns de lucru cu îndrumările utile din comentariile de aici. Cheia este că, în ambele clase de Normalizer, nu foloseam suportă normalizarea funcţie

 /**
 * Verifică dacă clasa dată este acceptată pentru normalizare de către acest normalizator.
 */
   funcția publică acceptă normalizarea ($date, $format = NULL) {
      if (!este_obiect($date) || !$this->checkFormat($format)) {
        returnează FALSE;
      }
      if ($data instanceof NodeInterface && $data->getType() == 'myContentType') {
        returnează TRUE;
      }
        returnează FALSE;
      }
    }

Cu funcția de mai sus, pot continua să am prioritatea pentru ambii normalizatori în services.yml setată la aceeași valoare (de exemplu, „10”), se va declanșa pentru ambele, dar va returna false dacă nu se potrivește cu conținutul specific. tip.

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.