Проблемы с автозагрузкой классов с помощью JLoader :: registerPrefix


8

Вероятно, это действительно глупый вопрос, но я не могу найти ответ, и метод проб и ошибок не удался.

Я разрабатываю компонент для Joomla 3.x и у меня есть несколько классов, которые я хочу использовать. Я пытаюсь реализовать JLoader::registerPrefix()метод. Допустим, у меня есть два класса Helperи NotHelpful. Helperстатический класс хранится в:

JPATH_LIBRARIES. '/Foo/bar/Helper.php'

и NotHelpfulявляется нестатическим классом, хранящимся в:

JPATH_LIBRARIES. '/Foo/baz/NotHelpful.php'

Если я хочу зарегистрировать это, я понимаю, что позвонил бы:

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

что я делаю с точки входа в приложение.

Затем, чтобы позвонить Helper, я бы просто использовал FooBarHelper::method1();или для создания нового NotHelpfulбыло бы$Class = new FooBazNotHelpful();

Что мне неясно, так это то, каким должно быть фактическое имя класса внутри Helper.php или NotHelpful.php . Должна ли она быть FooBarHelper, Helper, BarHelperили что - то совсем другое?

Когда я пытаюсь позвонить, FooBarHelper::method1();я получаю сообщение об ошибке, независимо от того, как называется мой класс:

Неустранимая ошибка PHP: класс 'FooBarHelper' не найден в

Я явно делаю хотя бы одну вещь неправильно. Может кто-нибудь сказать мне, что один или несколько из них?

Ответы:


1

Мое понимание загрузчика префиксов состоит в том, что ваши имена файлов ВСЕГДА будут строчными.

Это хорошо: JLoader::registerPrefix('Foo', JPATH_LIBRARIES . '/foo');

Но тогда ваши имена классов переводятся на разные пути классов.

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

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

Система префиксов всегда следует этому соглашению, основываясь на документации здесь :

Имя класса должно быть в случае верблюда, и каждый сегмент имени будет представлять путь к папке, где последний сегмент имени является именем файла класса.

Чтобы ответить на ваш последний вопрос, имя класса должно быть CamelCase, и оно должно быть в файле с строчными буквами и в папках, которые строчными.


Таким образом, в этом примере будет определение класса в полезным.php class Helpful { ...или class FooBazNotHelpful { ...или что-то еще?
Энди

класс FooBazNotHelpful @andy
Дэвид Фрич

4

Схема, которую вы ищете, на самом деле [ComponentName] [Directory] [Name]. Компоненты обычно имеют как минимум следующие каталоги: контроллер, модель, представление, помощники. Для компонента с именем com_mycomponent с вспомогательным файлом helper.php это будет MycomponentHelperHelper. Форматирование верблюдов особенно важно для того, чтобы класс правильно распознавался.

Если ваш компонент не предоставляет классы, которые вы хотели бы сделать доступными для других компонентов, вам не нужно использовать JLoader :: registerPrefix (). Вместо этого вы можете просто использовать JLoader :: Discover () и предоставить эти классы вашему компоненту. для com_mycomponent / helpers это будет означать

JLoader :: Discover ('Помощники', JPATH_COMPONENT. '/ Helpers');

Вы также можете использовать JLoader :: registerNamespace () для использования пространств имен PHP.

См. Http://docs.joomla.org/Using_own_library_in_your_extensions для получения дополнительной информации об этих методах.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.