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?

rybosome
sumber

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.

Berdir
sumber
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

stefgosselin
sumber
5

spl_autoload_functions()mengembalikan daftar fungsi pengisian otomatis yang telah didaftarkan spl_autoload_register(). Drupal mendaftarkan dua fungsi autoload: satu untuk kelas ( drupal_autoload_class () ), dan satu untuk antarmuka ( drupal_autoload_interface () ).

Kedua fungsi tersebut menggunakan _registry_check_code () ; menggunakan kodenya, Anda dapat menulis fungsi yang mencantumkan semua kelas yang diterapkan oleh modul Drupal 7.

kiamlaluno
sumber
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.

Webdesigner007
sumber
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.

Ashlar
sumber
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