Sự cố tự động tải các lớp với JLoader :: registerPrefix


8

Đây có lẽ là một câu hỏi thực sự ngu ngốc nhưng tôi không thể tìm thấy câu trả lời và thử nghiệm và lỗi đã thất bại.

Tôi đang phát triển một thành phần cho Joomla 3.x và tôi có một số lớp mà tôi muốn sử dụng. Tôi đang cố gắng thực hiện JLoader::registerPrefix()phương pháp. Hãy nói rằng tôi có hai lớp HelperNotHelpful. Helperlà một lớp tĩnh được lưu trữ tại:

JPATH_LIBRARIES. '/foo/bar/Helper.php'

NotHelpfullà một lớp không tĩnh được lưu trữ tại:

JPATH_LIBRARIES. '/foo/baz/NotHelpful.php'

Nếu tôi muốn đăng ký những hiểu biết này, tôi sẽ gọi:

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

mà tôi đang làm từ điểm vào ứng dụng.

Sau đó, để gọi Helper, tôi chỉ cần sử dụng FooBarHelper::method1();hoặc khởi tạo một cái mới NotHelpfulsẽ là$Class = new FooBazNotHelpful();

Điều không rõ ràng với tôi là tên lớp thực tế bên trong Helper.php hoặc NotHelpful.php nên là gì. Nó phải được FooBarHelper, Helper, BarHelper, hay cái gì khác hoàn toàn?

Khi tôi cố gắng gọi, FooBarHelper::method1();tôi nhận được lỗi cho dù lớp của tôi có tên là gì:

Lỗi nghiêm trọng của PHP: Không tìm thấy lớp 'FooBarHelper' trong

Tôi rõ ràng đang làm ít nhất một điều sai. Bất cứ ai có thể cho tôi biết một hoặc nhiều trong số họ là gì?

Câu trả lời:


1

Sự hiểu biết của tôi về trình tải tiền tố là tên tệp của bạn LUÔN LUÔN là chữ thường.

Điều này là tốt: JLoader::registerPrefix('Foo', JPATH_LIBRARIES . '/foo');

Nhưng sau đó, tên lớp của bạn dịch sang các đường dẫn lớp khác nhau.

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

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

Hệ thống tiền tố luôn tuân theo quy ước này, dựa trên tài liệu ở đây :

Tên lớp phải ở trong trường hợp lạc đà và mỗi phân đoạn của tên sẽ đại diện cho một đường dẫn thư mục trong đó phân đoạn cuối cùng của tên là tên của tệp lớp.

Để trả lời câu hỏi cuối cùng của bạn, tên lớp phải là CamelCase và nó phải nằm trong một tệp có tên chữ thường và nằm trong các thư mục đều là chữ thường.


Vì vậy, trong ví dụ này sẽ định nghĩa lớp trong helpful.php được class Helpful { ...hay class FooBazNotHelpful { ...hay cái gì khác?
Andy

lớp FooBazNotHelpful @andy
David Fritsch

4

Lược đồ mà bạn đang tìm kiếm thực sự là [Tên thành phần] [Thư mục] [Tên]. Các thành phần thường có ít nhất các thư mục sau: bộ điều khiển, mô hình, khung nhìn, bộ trợ giúp. Đối với một thành phần được gọi là com_mycomponent với tệp trợ giúp là helper.php, đó sẽ là MycomponentHelperHelper. Định dạng lạc đà đặc biệt quan trọng trong lớp được nhận dạng đúng.

Trừ khi thành phần của bạn đang cung cấp các lớp mà bạn muốn cung cấp cho các thành phần khác, bạn không cần sử dụng JLoader :: registerPrefix (). Thay vào đó, bạn có thể chỉ sử dụng JLoader :: Discover () và cung cấp các lớp đó cho thành phần của bạn. đối với com_mycomponent / người trợ giúp điều này có nghĩa là

JLoader :: khám phá ('Người trợ giúp', JPATH_COMPONENT. '/ Người trợ giúp');

Bạn cũng có thể sử dụng JLoader :: registerNamespace () để sử dụng các không gian tên PHP.

Xem http://docs.j Joomla.org/Using_own_l Library_in_your_extensions để biết thêm chi tiết về các phương thức đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.