Модули
include.php и autoload
Рабочая справка по include.php и автозагрузке классов в локальном модуле Bitrix.
include.php подключается при Loader::includeModule('module.id').
В нём лучше держать только регистрацию автозагрузки и минимальную инициализацию, а не всю
логику модуля.
include.php
Этот файл нужен, чтобы модуль мог подготовить свои классы и функции к использованию.
Когда подключается
Если в коде вызвать Loader::includeModule('test.example'), Битрикс
подключит файл /local/modules/test.example/include.php.
<?php
use Bitrix\Main\Loader;
if (!Loader::includeModule('test.example')) {
throw new \RuntimeException('Модуль test.example не подключен');
} Что писать внутри
В include.php обычно достаточно зарегистрировать классы, подключить
служебные функции и не выполнять тяжёлую бизнес-логику.
| Можно | Лучше не делать |
|---|---|
| Регистрация автозагрузки. | Массовые запросы к базе при каждом подключении. |
| Подключение небольшого файла с функциями. | Изменение CRM-данных при подключении модуля. |
| Определение констант модуля. | Регистрация событий при каждом хите. События лучше регистрировать при установке. |
Минимальный include.php
<?php
defined('B_PROLOG_INCLUDED') || die();
use Bitrix\Main\Loader;
const test_EXAMPLE_MODULE_ID = 'test.example';
Loader::registerAutoLoadClasses(
test_EXAMPLE_MODULE_ID,
[
\test\Example\Service\ExampleService::class => 'lib/Service/ExampleService.php',
\test\Example\Model\ExampleTable::class => 'lib/Model/ExampleTable.php',
\test\Example\Controller\Example::class => 'lib/Controller/Example.php',
]
); Автозагрузка
Автозагрузка нужна, чтобы не писать require_once для каждого класса модуля.
lib и namespace
Классы модуля удобно хранить в папке lib. Namespace лучше строить от
названия модуля.
/local/modules/test.example/
└── lib/
└── Service/
└── ExampleService.php <?php
namespace test\Example\Service;
class ExampleService
{
/**
* Возвращает тестовое сообщение.
*/
public function getMessage(): string
{
return 'Модуль подключен';
}
} Loader::registerAutoLoadClasses
Явная регистрация классов удобна для небольших модулей: сразу видно, какой класс где лежит.
<?php
use Bitrix\Main\Loader;
Loader::registerAutoLoadClasses(
'test.example',
[
\test\Example\Service\ExampleService::class => 'lib/Service/ExampleService.php',
\test\Example\Service\OptionService::class => 'lib/Service/OptionService.php',
\test\Example\Model\ExampleTable::class => 'lib/Model/ExampleTable.php',
]
); Если классов много, лучше придерживаться понятной структуры папок и не смешивать сервисы, ORM-таблицы, контроллеры и обработчики событий в одной директории.
Проверка подключения
Простой тест: подключить модуль и создать объект класса из lib.
<?php
use Bitrix\Main\Loader;
use test\Example\Service\ExampleService;
require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
Loader::includeModule('test.example');
/**
* Проверяет работу автозагрузки модуля.
*/
function testExampleService(): void
{
$service = new ExampleService();
echo $service->getMessage();
}
testExampleService();
Если класс не найден, проверь namespace, регистр букв в пути, запись в
registerAutoLoadClasses() и факт подключения модуля.