PHP
#bitrix#module#Loader#autoload#include.php#PSR-4

Модуль Битрикс: автозагрузка классов через Loader::registerAutoLoadClasses

Регистрация автозагрузки классов модуля в include.php по пути от корня модуля. По документации Битрикс — без require_once и сломанных путей при переносе.

Как использовать

  1. В корне модуля создайте lib/ с неймспейсами (например lib/Service/DateProvider.php → Vendor\SimpleModule\Service\DateProvider).
  2. В include.php модуля вызовите Loader::registerAutoLoadClasses(MODULE_ID, массив класс => путь от корня модуля).
  3. Путь указывайте от корня модуля, без ведущего слеша (например lib/Service/DateProvider.php).
  4. В коде используйте use и класс по неймспейсу; не подключайте файлы через require_once.

Закрывает боль: в модуле подключают классы через require_once с относительными путями — при смене места вызова или структуры папок получаем «Failed opening required». По документации Битрикс классы модуля регистрируют через Loader::registerAutoLoadClasses() в include.php; пути задаются от корня модуля.

Структура:

/local/modules/vendor.simplemodule/
├── include.php
└── lib/
    └── Service/
        └── DateProvider.php

include.php модуля:

<?php

use Bitrix\Main\Loader;

Loader::registerAutoLoadClasses(
    'vendor.simplemodule',
    [
        'Vendor\\SimpleModule\\Service\\DateProvider' => 'lib/Service/DateProvider.php',
        'Vendor\\SimpleModule\\EventHandler'          => 'lib/EventHandler.php',
    ]
);

Класс lib/Service/DateProvider.php:

<?php
namespace Vendor\SimpleModule\Service;

class DateProvider
{
    public static function getCurrentDate(): string
    {
        return date('d.m.Y');
    }
}

Использование в компоненте или другом коде:

use Vendor\SimpleModule\Service\DateProvider;

$date = DateProvider::getCurrentDate();

Важно: Первый аргумент — MODULE_ID (строка). Ключи массива — полные имена классов с экранированными обратными слэшами (Vendor\\SimpleModule\\Service\\DateProvider). Значения — пути от корня модуля, без __DIR__ и без ведущего слеша. После установки модуля автозагрузка доступна везде, где подключают модуль через Loader::includeModule('vendor.simplemodule').