← Назад к справке

Модули

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() и факт подключения модуля.

Источники