Puncte:0

Cele mai bune practici pentru obținerea valorilor de câmp ale lanțurilor de entități

drapel cn

Chiar aș dori să fac această verificare a valorii câmpului if/else doar puțin mai sexy.

Care este cea mai bună practică pentru a trata lanțurile de funcții imbricate pentru a obține valorile câmpurilor de entitate (verificați dacă acestea există / verificați dacă nu sunt goale)

 if($entity->hasField('field_intro_teaser_image_media_')){
      $media_field = $entity->field_intro_teaser_image_media_;

      if($media_field->entity){
        $media_field_entity = $media_field->entity;

        if($media_field_entity->hasField('field_media_image')){
          $media_field_entity_image = $media_field_entity->field_media_image;

          if($media_field_entity_image){
            $media_field_entity_image_entity = $media_field_entity_image->entity;

            if($media_field_entity_image_entity){
              $media_field_entity_image_entity_uri = $media_field_entity_image->entity->getFileUri();

              if($media_field_entity_image_entity_uri){

                // ... da, ne-am luat naibii de uri!

              }

            }
          }
        }
      }
    }

Singura căptușeală ar fi:

$media_field = $entity->field_intro_teaser_image_media_->entity->field_media_image->entity->getFileUri();



  
drapel cn
Nu l-am încercat încă pe câmpurile de entitate, dar [operator null-safe](https://php.watch/versions/8.0/null-safe-operator)?
Kevin avatar
drapel in
Linerul unic ar eșua dacă ceva din lanț nu are câmpul sau entitatea relațională, așa că ați dori să-l includeți într-o declarație try catch.
4uk4 avatar
drapel cn
Sau utilizați Twig, consultați https://drupal.stackexchange.com/questions/271579/get-video-url-from-media-entity-reference-field. Twig este null sigur în mod implicit, dacă nu setați strict_variables.
Puncte:1
drapel us

Când accesați câmpuri prin metode magice, de fapt nu trebuie să verificați existența lor prin utilizarea hasField() metodă.:

$entity->câmp_care_nu_există->entity; // NUL.
$entity->get('câmp_care_nu_există'); // Excepție.
$entity->get('câmp_care_nu_există')->entity; // Excepție.

Folosind $entity->field_intro_teaser_image_media_->entity este suficient în acest caz, dacă câmpul nu există, expresia va fi simplă NUL, fara nicio eroare.

Dar, desigur, trebuie să verificați dacă este referit ->entitate nu este NUL. Operatorul PHP 8.0 Null-safe poate fi o modalitate de a face acest lucru, după cum sugerează Clive.

$media_field = $entitate
  ->field_intro_teaser_image_media_
  ->entitate
  ?->field_media_image
  ->entitate
  ?->getFileUri();

În cazul utilizării operatorului Null-safe, va fi probabil mai rapid să accesați câmpurile de entitate prin ->get(), pentru a evita o logică suplimentară.

$media_field = $entitate
  ->get('field_intro_teaser_image_media_')
  ?->entitate
  ?->get('field_media_image')
  ?->entitate
  ?->getFileUri();

mogio avatar
drapel cn
mulțumesc . Iubește operatorul Null Safe. Nu l-a folosit niciodată până acum.
Puncte:1
drapel de

Presupunând că ați construit lanțul corect, puteți face acest lucru după cum urmează:

$media_field = NULL;
încerca {
  $media_field = $entity->field_intro_teaser_image_media_->entity->field_media_image->entity->getFileUri();
}
captură (\Excepție $e) {
  watchdog_exception('Preluare media');
}

dacă (!este_null($câmp_media)) {
  // Faceți lucruri.
}
mogio avatar
drapel cn
Mulțumiri. Am făcut-o așa.

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.