Bagaimana Drupal menangani autoloading kelas?


10

Bagaimana Drupal menangani autoloading kelas melalui modul? Misalnya, jika saya memiliki modul Acara, dan saya mendeklarasikan kelas yang disebut Acara, dan kemudian dalam file .info saya menyertakan file kelas, bagaimana ini terdaftar?

Masalahnya adalah bahwa saya mencoba secara dinamis mendapatkan array yang berisi semua nama kelas yang dimuat. get_declared_classes () tidak mengembalikan nama semua kelas saya yang dideklarasikan dengan cara ini, jadi saya berasumsi bahwa mereka entah bagaimana memuat secara otomatis. Mengikuti saran dari pertanyaan stack overflow lainnya, saya mencoba mendapatkan semuanya dengan spl_autoload_functions () , tetapi itu juga tidak berhasil.

Ada ide?

Jawaban:


13

Semua file yang tercantum dalam file .info diuraikan ketika modul dibangun kembali (Hanya diubah / file baru dalam daftar itu adalah, untuk alasan kinerja).

Informasi itu kemudian disimpan dalam tabel {registry}dan {registry_files}. Jadi jika Anda ingin mendapatkan semua kelas atau yang sesuai dengan pola penamaan yang diberikan, Anda bisa meminta tabel tersebut.


7

Drupal mengelola kode registri dan menggunakannya untuk autoloader kelasnya. Untuk mengisi registri ini dengan kelas-kelas modul Anda, Anda harus menambahkan file-file mereka ke entri file [] dalam file .info itu:

files[] = includes/Foo.inc
files[] = includes/Bar.inc

Kelas autoloading PHP akan memastikan bahwa file kelas induk juga dimuat.

Kredit untuk pengguna pier-buyle untuk jawaban ini, lihat jawaban aslinya di sini untuk pertanyaan yang sama.

Semoga itu bisa membantu



3

Jika Anda telah menambahkan entri ke array file [] dari file .info, Anda harus pergi ke bagian administrasi modul Anda dan klik "simpan konfigurasi". Ini akan mendapatkan drupal untuk menyegarkan informasi .info, dan entri baru akan didaftarkan.


1

Saya telah menemukan bahwa mendeklarasikan file sertakan saya di file info tidak membuatnya dikenali ketika saya mulai menjalankan modul. Jika saya memiliki Event kelas di file event.inc. tetapi membuat sebuah objek dalam modul, itu tidak dikenali. Saya tambahkan baris

include_once ('CMatArticleHandler.inc');

sebelum $ variabel = acara baru (); baris. Saya baru dalam hal ini sehingga mungkin ada lebih dari itu maka ini, tetapi telah bekerja sejauh ini.


1
Sangat disayangkan bahwa orang hanya downvote ini daripada menjelaskan apa yang harus dilakukan untuk menghindari perlu melakukan ini. Saya berada dalam situasi yang sama: autoloader Drupal tidak secara konsisten mengenali kebutuhan untuk memuat file untuk mendapatkan kelas.
Greggles

Orang perlu menghapus registri saat menambahkan kelas baru. Cara mudah untuk melakukan hal lain melalui drush adalah dengan perintah ini: drupal.org/project/registry_rebuild
stefgosselin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.