В статье "Техники быстрой разработки: предотвращение фрагментации кода в Joomla" был рассмотрен метод подключения файлов из своей библиотеки при помощи jimport
. Он работает, но имеет два недостатка:
- внесение изменения в файл ядра loader.php
- необходимость при каждом подключении файла писать
jimport
Обойти эти недостатки нам поможет класс JLoader. Он предоставляет возможность подключать отдельные классы и целые библиотеки с помощью автозагрузчика классов Joomla. Предположим, что файлы вашей библиотеки расположены в /libraries/mylib. Давайте рассмотрим различные способы использования автозагрузчика для подключения классов из нашей библиотеки и облегчения работы при разработке расширений.
Регистрация классов
С помощью метода register() вы можете добавить конкретный класс в автозагрузчик:
JLoader::register('MylibUser', JPATH_LIBRARIES . '/mylib/user.php');
Теперь в любой точки вашего расширения вы можете обратиться к классу MylibUser
без необходимости явного подключения вроде jimport
или require_once
.
Поиск классов
Этот способ позволяет подключить целую библиотеку. Метод discover() смотрит на имена файлов в папке и регистрирует классы, основываясь на этих именах.
// Регистрируем все файлы в папке /libraries/mylib как классы с именем Mylib<имяфайла>
JLoader::discover('Mylib', JPATH_LIBRARIES . '/mylib');
Как видите, этот метод работает, если вы следуете определенному именованию файлов и классов:
/mylib/user.php равно классу MylibUser
/mylib/userhelper.php равно классу MylibUserHelper
и т.д.
Дополнительные аргументы позволяют обновить путь уже зарегистрированного класса и рекурсивно пройтись по поддиректориям:
// Регистрируем все файлы в папке /libraries/mylib, а также в подпапках как классы с именем Mylib<имяфайла>
JLoader::discover('Mylib', JPATH_LIBRARIES . '/mylib', false, true);
Загрузка классов через регистрацию префикса
Начиная с версии Joomla Platform 12.1 (Joomla CMS 3+) существует возможность зарегистрировать префикс класса, по которому автозагрузчик будет искать классы вашей библиотеки (до этого была поддержка только префикса "J", который привязан к папке /libraries/joomla). Это позволяет нам сделать следующее:
- зарегистрировать префикс своих классов и корневой путь до них;
- зарегистрировать дополнительный путь для существующего префикса (например, это позволяет Joomla CMS использовать дополнительные библиотеки, при этом используя префикс "J");
- зарегистрировать переопределение префикса. Это может быть использовано для переопределения базовых классов.
Чтобы использовать метод registerPrefix() необходимо следовать определенному соглашению по именованию классов и файлов. Имя класса должно быть в camel case, где каждый сегмент имени представляет путь к папке, а последний сегмент является именем файла класса. Если в имени класса только одна часть, то автозагрузчик будет искать файл в папке с таким же названием. Названия папок должны быть в нижнем регистре.
Например:
Класс PrefixUserModel
должен находиться в ПУТЬ_ДО_ПРЕФИКСА/user/model.php
Класс PrefixUser
должен находиться в ПУТЬ_ДО_ПРЕФИКСА /user/user.php
Применительно к нашему примеру:
Класс MylibUserHelper
должен находиться в /libraries/mylib/user/helper.php
Класс MylibUser
должен находиться в /libraries/mylib/user/user.php
// Ищем классы, начинающиеся с "Mylib" в папке /libraries/mylib.
JLoader::registerPrefix('Mylib', JPATH_LIBRARIES . '/mylib');
// Ищем классы с префиксом "J" дополнительно в папке /libraries/cms.
JLoader::registerPrefix('J', JPATH_PLATFORM . '/cms');
// Сбрасываем префикс "J" и указываем на свой форк платформы.
JLoader::registerPrefix('J', '/my/platform/fork', true);
Обратите внимание на то, что такие акронимы как HTML, XML и MySQL в названиях классов тоже должны придерживаться соглашения camel case: HTML становится Html, XML становится Xml и т.д.
Доступ к библиотеке из любой точки Joomla
Все эти способы хороши, но иногда необходимо иметь доступ к своей библиотеке не только из конкретного расширения, но и из любой точки приложения. В этом нам поможет написание небольшого плагина на событие onAfterInitialise
:
class plgSystemMylib extends JPlugin
{
public function onAfterInitialise()
{
JLoader::registerPrefix('Mylib', JPATH_LIBRARIES . '/mylib');
}
}
Все просто – после инициализации приложения мы регистрируем наш префикс, и автозагрузчик начинает работать на нас. Теперь в любой точке приложения, будь то модуль, компонент или плагин мы можем получить доступ к классам из нашей библиотеки. Пример полного плагина можно увидеть здесь.
Удачной вам разработки!