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

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

Я разрабатываю компонент для 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 Неустранимая ошибка: Class 'FooBarHelper' не найден в

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

8 голосов | спросил Andy 17 12014vEurope/Moscow11bEurope/MoscowMon, 17 Nov 2014 22:52:01 +0300 2014, 22:52:01

2 ответа


1

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

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

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

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

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

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

  

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

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

ответил David Fritsch 23 72014vEurope/Moscow11bEurope/MoscowSun, 23 Nov 2014 07:34:07 +0300 2014, 07:34:07
4

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

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

JLoader :: открыть («Помощники», JPATH_COMPONENT. /помощники);

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

Подробнее об этих методах см. http://docs.joomla.org/Using_own_library_in_your_extensions .

ответил Jeremy Proffitt 22 62014vEurope/Moscow11bEurope/MoscowSat, 22 Nov 2014 21:23:35 +0300 2014, 21:23:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132