Saya menemukan bahwa masalah terbesar dalam bekerja dengan Drupal 8 adalah saya tidak bisa mendapatkan data yang saya butuhkan. Drupal 8 ingin saya menggunakan metode publik daripada secara manual menelusuri objek. Masalahnya adalah, saya tidak dapat menemukan cara yang konsisten untuk mendapatkan daftar metode yang tersedia! (mereka secara ajaib ada, dan saya merasa seperti saya seharusnya tahu tentang mereka). =
Untuk contoh ini, katakanlah saya memiliki tipe konten dengan bidang video. Saya perlu mendapatkan URL mentah dari file video di bidang itu.
Jadi saya akan mulai dengan id node ($ nid), dan entah bagaimana saya harus mencari cara untuk memuat node. Ini tidak terlalu buruk karena ada banyak contoh. Jadi saya melakukan sesuatu seperti $node = \Drupal\node\Entity\Node::load($nid);
.
Sejauh ini baik. Maka saya perlu mendapatkan nilai dari bidang video saya (field_main_video). Ini mengambil saya SELAMANYA untuk mencari tahu karena ada dokumentasi yang saling bertentangan di sekitar 'net. Akhirnya saya tahu saya harus melakukan sesuatu seperti ini (karena ini adalah item bernilai ganda):
$video = \Drupal\node\Entity\Node::load($nid)->field_main_video->getValue();
... lalu loop melalui array dll. Menggunakan kint tidak membantu saya menemukan ini juga. Karena, misalnya, jika saya kint($node)
dan mencari di bawah metode, saya tidak melihat getValue () sebagai item di sana. Masih tidak mengerikan, karena ada cukup banyak contoh untuk mencari tahu.
Ketika saya masuk lebih dalam, apa yang saya tidak tahu (ini adalah bagian yang penting) adalah bahwa alih-alih mendapatkan id entitas bidang video, lalu memuat entitas, lalu menemukan bidang "uri" di entitas, dll (seperti Saya akan di D7): Ada metode yang memungkinkan saya mendapatkan URI semua dalam baris kode yang sama!
$url = \Drupal\node\Entity\Node::load($nid)->field_main_video->entity->getFileUri();
Tapi bagaimana mungkin saya tahu getFileUri () ini ada? Saya kebetulan menemukannya di sebuah posting blog. Ini benar-benar TIDAK membuat mendapatkan URI lebih mudah daripada di D7 ... tetapi hanya jika Anda tahu (secara ajaib) metode apa yang ada untuk setiap 'level' dari suatu objek.
Pada akhirnya, dengan contoh ini saya bertanya: Bagaimana Anda menemukan semua metode publik untuk setiap tingkat objek dengan cara yang mudah dibaca dan dipahami? Perhatikan bahwa tampaknya harus ada cara drupal-centric (mis. Devel module) untuk melakukan ini daripada mencari secara manual api.drupal.org atau menggunakan sesuatu yang spesifik IDE?
Jawaban:
Entitas konten berbeda dari kebanyakan hal lain karena mereka sering tidak memiliki metode dan antarmuka yang tepat, setidaknya tidak untuk bidang yang dapat dikonfigurasi.
Dalam hal entitas dan bidang konten, metode publik tidak benar-benar ingin Anda ketahui, apa yang Anda ingin ketahui tentang bidang dan properti. Dan hanya ketika Anda mendapatkan entitas lagi melalui referensi maka metode itu penting.
Untuk gambaran umum, saya selalu merujuk ke Lembar Cheat API Entitas yang hebat .
Entitas konten memiliki struktur tetap, Entitas> Bidang (FieldItemList)> FieldItem -> Properti. Properti adalah skalar atau referensi ke sesuatu yang lain, misalnya entitas lain, objek bahasa, objek tanggal, ...
Untuk beberapa contoh tertentu, beberapa cuplikan berguna:
sumber
Tidak yakin apakah itu akan sepenuhnya menjawab pertanyaan Anda, tetapi yang banyak membantu saya adalah menggunakan fitur diagram di PhpStorm.
Misalnya menunjukkan hierarki
Anda memiliki opsi untuk menampilkan juga nama metode
Saya harap ini membantu Anda.
sumber
Yah, saya menemukan diri saya cukup sering menggunakan kombinasi
var_dump(get_class_methods($object))
untuk memiliki daftar metode yang tersedia untuk kelas yang diberikan.Saya juga sering melihat
api.drupal.org
detail lebih lanjut.sumber
Anda sudah sangat dekat.
Pertama, mari kita lihat definisi metode ini: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3AgetFileUri/8.2.x
Dari sini, kita bisa melihat kelas ini bagiannya, dan ada tautannya:
Mengklik melalui membawa kita ke: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/class/File/8.2.x
Di IDE Anda, Anda juga bisa mencari
\Drupal\file\Entity\File
kelas. Salah satu cara untuk memastikan ini adalah kelas yang benar adalah dengan melihat penjelasannya:Perhatikan
id
- itufile
. Agaknya, jika debugging, Anda bisa melihat kontenfield_main_video->entity
dan Anda akan melihat ID ini di suatu tempat. Maka Anda cukup mencarinya di IDE Anda. Namun, biasanya, orang cukup tahu tentang tipe entitas yang digunakan untuk menebak jalan ke kelas yang benar (setelah itu orang dapat memverifikasi bahwa anotasi berisi ID yang benar).Dalam kasus ini, saya juga tahu bahwa
File
adalah mungkin kelas yang meluasContentEntityBase
, karena itu lebih seperti isi database (badan konten) dari konfigurasi (entitas konfigurasi). Jadi ketika saya melihat asumsi saya menegaskan, itu membantu saya tahu saya telah menemukan kelas yang tepat.Jadi, singkatnya: IDE Anda,
debug()
pernyataan strategis , dan beberapa tebakan adalah cara terbaik untuk menemukan Drupal 8.Catatan perubahan PS juga bisa membantu. Mereka ada di https://www.drupal.org/list-changes/drupal
sumber
Anda dapat menggunakan fungsi get_class_methods PHP. Contoh di bawah pengguna mengunggah file:
Ini akan menambahkan semua metode yang tersedia ke objek $ file ke dalam array $ methods Anda, yang dapat Anda cetak dan kemudian lihat semua metode yang tersedia. Ini berlaku untuk objek apa pun di PHP, bukan hanya Drupal.
sumber