Puncte:1

Metoda getTitle() returnează o valoare neașteptată. Ce cauzează asta?

drapel kz

Într-o implementare a hook_node_insert(), am următoarele trei linii de cod:

dpm($entity, 'entity');
$titlu = $entitate->getTitle();
dpm($titlu, 'titlu');

Din prima dpm() Eu iau:

entitate =>
Drupal\nod\Entitate\Nod {#1632 â¼
  +in_preview: nul
  #valori: matrice:27 [â¼
    ...
    „title” => matrice:1 [â¼
       „x-default” => matrice:1 [â¼
        0 => matrice:1 [â¼
          „value” => „Titlul așteptat”
        ]
     ]
...

i.e. câmpul de titlu produs de dumperul variabil este câmpul de titlu pe care mă așteptam să îl văd.

Al doilea dpm() produce:

titlu =>
„Titlul anterior”

i.e. când extrag titlul din entitate, folosind getTitle() metoda, primesc o diferit valoare. Valoarea este de la o entitate (nod) încărcată I într-un controler de legătură de operațiuni (overriding ControllerBase), dar nu a fost salvat în interiorul controlerului și nu ar trebui să se declanșeze hook_node_insert().

Construiesc și salvez un nou nod în controler, folosind acest cod:

$nod = \Drupal::entityTypeManager()->getStorage('nod')->create([
  'type' => 'tipul_meu',
  'body' => 'corp',
]);
$node->setTitle('Titlul așteptat');
$nod->salvare();

Presupun că acesta este $nod->salvare();care trage hook_node_insert.

Ce se intampla aici?

De ce apare titlul fals în cârlig și cum obțin rezultatul așteptat?

Pentru înregistrare: nu schimb nodul în hook_node_insert. Îl șterg dacă titlul îndeplinește anumite criterii. Nu pot folosi o constrângere pentru a împiedica crearea acesteia din motive care nu au legătură cu această întrebare.

4uk4 avatar
drapel cn
Acest lucru nu este ușor de urmărit din mai multe motive. Matricea de valori protejate dintr-o entitate de conținut nu trebuie să fie citită de cod personalizat. Conține întotdeauna valori originale, x-default este constanta pentru limba implicită. Deci, este normal ca getTitle() returnează un rezultat diferit. dpm() nu este un instrument de depanare în timp real. Acesta pune ieșirea într-o sesiune care uneori este afișată cu una sau două solicitări mai târziu, în funcție de data viitoare când este afișat blocul de mesaje. Încercați Xdebug. În plus, hook_node_insert() este prea târziu pentru a schimba nodul, utilizați un cârlig de presare.
Free Radical avatar
drapel kz
@4uk4 Am crezut că metodele furnizate de clasă pentru obținerea valorilor protejate trebuiau să returneze valoarea reală a câmpului. Sunt surprins să aflu că acest lucru nu este întotdeauna adevărat. Mulțumesc că m-ai înghiontat în direcția Xdebug
Puncte:1
drapel cn

Într-o entitate de conținut, protejat $valori matricea conține valorile originale ale entității. Valorile reale ale câmpului sunt stocate în matricea protejată $câmpuri, care deține o matrice de obiecte FieldItemList. Acestea sunt construite leneș, așa că atunci când nodul este încărcat, această matrice este goală. Când obțineți/setați câmpuri prin metodele și proprietățile entității publice, obiectele câmpului cu datele reale vor fi create și stocate în această matrice internă.

În scopul depanării, puteți forța $câmpuri matrice pentru a fi complet populată de

$valori = $nod->toArray();

Aceasta returnează valorile entității prin crearea tuturor obiectelor câmp și construirea unei matrice de valori reale ale câmpului.

Pentru a verifica proprietățile obiectului, nu folosiți dpm() deoarece nu știți dacă rezultatul afișat provine din aceeași cerere.

leymannx avatar
drapel ne
Ar adăuga informațiile despre cârlig și Xdebug. Comentariul tău este de aur.
Free Radical avatar
drapel kz
Vă mulțumim pentru un răspuns foarte educativ despre cum funcționează în culise utilizarea metodelor entităților publice pentru a accesa câmpurile protejate.

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.