Masalah memuat kelas secara otomatis dengan JLoader :: registerPrefix


8

Ini mungkin pertanyaan yang sangat bodoh tetapi saya tidak dapat menemukan jawaban dan percobaan dan kesalahan telah gagal.

Saya mengembangkan komponen untuk Joomla 3.x dan saya memiliki sejumlah kelas yang ingin saya gunakan. Saya mencoba menerapkan JLoader::registerPrefix()metode ini. Katakanlah saya punya dua kelas Helperdan NotHelpful. Helperadalah kelas statis yang disimpan di:

JPATH_LIBRARY. '/foo/bar/Helper.php'

dan NotHelpfulkelas non-statis disimpan di:

JPATH_LIBRARY. '/foo/baz/NotHelpful.php'

Jika saya ingin mendaftarkan pemahaman saya ini saya akan menelepon:

JLoader::registerPrefix('Foo', JPATH_LIBRARIES . '/foo'); 

yang saya lakukan dari titik masuk ke aplikasi.

Kemudian untuk menelepon Helper, saya hanya akan menggunakan FooBarHelper::method1();atau untuk memulai NotHelpfulakan menjadi baru$Class = new FooBazNotHelpful();

Yang tidak jelas bagi saya adalah apa seharusnya nama kelas di dalam Helper.php atau NotHelpful.php . Harus itu FooBarHelper, Helper, BarHelper, atau sesuatu yang lain sama sekali?

Ketika saya mencoba menelepon FooBarHelper::method1();saya mendapatkan kesalahan tidak peduli apa nama kelas saya tampaknya:

Kesalahan PHP Fatal: Kelas 'FooBarHelper' tidak ditemukan di

Saya jelas melakukan setidaknya satu hal yang salah. Adakah yang bisa memberi tahu saya apa satu atau lebih dari mereka?

Jawaban:


1

Pemahaman saya tentang pemuat awalan adalah bahwa nama file Anda SELALU akan menjadi huruf kecil semua.

Ini bagus: JLoader::registerPrefix('Foo', JPATH_LIBRARIES . '/foo');

Tetapi kemudian nama kelas Anda diterjemahkan ke jalur kelas yang berbeda.

FooBarHelper => JPATH_LIBRARIES . '/foo/bar/helper.php'

FooBazNotHelpful => JPATH_LIBRARIES . '/foo/baz/not/helpful.php'

Sistem awalan selalu mengikuti konvensi ini, berdasarkan pada dokumen di sini :

Nama kelas harus dalam case unta dan setiap segmen nama akan mewakili jalur folder di mana segmen terakhir dari nama adalah nama file kelas.

Untuk menjawab pertanyaan terakhir Anda, nama kelasnya harus CamelCase, dan harus dalam file yang memiliki nama huruf kecil dan ada di folder yang semuanya huruf kecil.


Jadi, dalam contoh ini akankah definisi kelas dalam helpful.php menjadi class Helpful { ...atau class FooBazNotHelpful { ...atau sesuatu yang lain?
Andy

kelas FooBazNotHelpful @andy
David Fritsch

4

Skema yang Anda cari sebenarnya [ComponentName] [Directory] [Name]. Komponen umumnya memiliki setidaknya direktori berikut: controller, model, view, helpers. Untuk komponen bernama com_mycomponent dengan file helper yaitu helper.php, itu adalah MycomponentHelperHelper. Pemformatan camelcase sangat penting di kelas agar dikenali dengan benar.

Kecuali komponen Anda menyediakan kelas yang ingin Anda sediakan untuk komponen lain, Anda tidak perlu menggunakan JLoader :: registerPrefix (). Anda bisa menggunakan JLoader :: discover (), dan memberikan kelas-kelas itu ke komponen Anda. untuk com_mycomponent / helpers ini artinya

JLoader :: temukan ('Pembantu', JPATH_COMPONENT. '/ Pembantu');

Anda juga dapat menggunakan JLoader :: registerNamespace () untuk menggunakan ruang nama PHP.

Lihat http://docs.joomla.org/Using_own_library_in_your_extensions untuk rincian lebih lanjut tentang metode tersebut.

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.