Điểm:0

Phương pháp hay nhất để nhận giá trị trường của chuỗi thực thể

lá cờ cn

Tôi thực sự muốn làm cho việc kiểm tra giá trị trường if/else này hấp dẫn hơn một chút.

Phương pháp hay nhất để xử lý các chuỗi hàm lồng nhau để nhận các giá trị trường thực thể (kiểm tra xem chúng có tồn tại/kiểm tra xem chúng có trống không)

 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->thực thể;

            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){

                // ... yay, chúng tôi đã nhận được uri chết tiệt!

              }

            }
          }
        }
      }
    }

Một lớp lót sẽ là:

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



  
lá cờ cn
Chưa thử trên các trường thực thể, nhưng [Null-safe operator](https://php.watch/versions/8.0/null-safe-operator)?
Kevin avatar
lá cờ in
Một lớp lót sẽ không thành công nếu bất kỳ thứ gì trong chuỗi không có trường hoặc thực thể quan hệ, vì vậy bạn muốn bọc nó trong một câu lệnh try catch.
4uk4 avatar
lá cờ cn
Hoặc sử dụng Twig, xem https://drupal.stackexchange.com/questions/271579/get-video-url-from-media-entity-reference-field. Twig không an toàn theo mặc định, nếu bạn không đặtstrict_variables.
Điểm:1
lá cờ us

Khi bạn truy cập các trường bằng phương pháp ma thuật, bạn không thực sự phải kiểm tra sự tồn tại của chúng bằng cách sử dụng hasField() phương pháp.:

$entity->field_that_does_not_exist->entity; // VÔ GIÁ TRỊ.
$entity->get('field_that_does_not_exist'); // Ngoại lệ.
$entity->get('field_that_does_not_exist')->entity; // Ngoại lệ.

sử dụng $entity->field_intro_teaser_image_media_->entity là đủ trong trường hợp này, nếu trường không tồn tại, biểu thức sẽ đơn giản là VÔ GIÁ TRỊ, không có bất kỳ lỗi nào.

Nhưng tất nhiên bạn vẫn phải kiểm tra nếu được tham chiếu -> thực thể không phải VÔ GIÁ TRỊ. PHP 8.0 Null-safe toán tử có thể là một cách để làm điều đó, như được đề xuất bởi Clive.

$media_field = $entity
  ->field_intro_teaser_image_media_
  -> thực thể
  ?->field_media_image
  -> thực thể
  ?->getFileUri();

Trong trường hợp sử dụng toán tử Null-safe, việc truy cập các trường thực thể có thể sẽ nhanh hơn bằng cách -> lấy(), để tránh logic bổ sung.

$media_field = $entity
  ->get('field_intro_teaser_image_media_')
  ?-> thực thể
  ?->get('field_media_image')
  ?-> thực thể
  ?->getFileUri();

mogio avatar
lá cờ cn
Cảm ơn . Yêu toán tử an toàn Null. Không bao giờ sử dụng nó cho đến nay.
Điểm:1
lá cờ de

Giả sử bạn đã xây dựng chuỗi chính xác, bạn có thể thực hiện như sau:

$media_field = NULL;
cố gắng {
  $media_field = $entity->field_intro_teaser_image_media_->entity->field_media_image->entity->getFileUri();
}
bắt (\Ngoại lệ $e) {
  watchdog_Exception('Truy xuất phương tiện');
}

nếu (!is_null($media_field)) {
  // Làm công cụ.
}
mogio avatar
lá cờ cn
Cảm ơn. Tôi đã làm nó theo cách này.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.