Bitrix /local: autoload.php — автозагрузка классов из lib
Регистрация классов /local/php_interface/lib через Loader::registerAutoLoadClasses. PSR-4, без Composer.
Как использовать
- Разместите файл в /local/php_interface/autoload.php
- Подключите из init.php после constants.php
- Классы в /local/php_interface/lib/ с namespace Project\
- Соблюдайте PSR-4: namespace = путь к файлу
Регистрация автозагрузки своих классов из /local/php_interface/lib через Loader::registerAutoLoadClasses. Первый параметр null — классы не принадлежат модулю ядра. Пути задаются от корня сайта ($_SERVER['DOCUMENT_ROOT']).
Базовая настройка
<?php
// /local/php_interface/autoload.php
use Bitrix\Main\Loader;
Loader::registerAutoLoadClasses(null, [
// Полное имя класса => путь от корня сайта
'Project\\Services\\OrderService' =>
'/local/php_interface/lib/Services/OrderService.php',
'Project\\Helpers\\Catalog' =>
'/local/php_interface/lib/Helpers/Catalog.php',
'Project\\Utils\\Formatter' =>
'/local/php_interface/lib/Utils/Formatter.php',
]);
Подключение в init.php:
<?php
// /local/php_interface/init.php
// 1. Сначала константы
require_once $_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/constants.php';
// 2. Затем автозагрузка
require_once $_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/autoload.php';
// 3. Затем события
require_once $_SERVER['DOCUMENT_ROOT'] . '/local/php_interface/events.php';
Пример класса сервиса
<?php
// /local/php_interface/lib/Services/OrderService.php
namespace Project\Services;
use Bitrix\Main\Event;
use Bitrix\Main\EventResult;
use Bitrix\Sale\Order;
class OrderService
{
/**
* Обработчик события сохранения заказа
*/
public static function onOrderSaved(Event $event): EventResult
{
$order = $event->getParameter('ENTITY');
if (!$order instanceof Order) {
return new EventResult(EventResult::SUCCESS);
}
try {
// Логика: CRM, склад, уведомления
$orderId = $order->getId();
// Отправка в CRM
self::sendToCRM($orderId);
// Обновление склада
self::updateWarehouse($orderId);
return new EventResult(EventResult::SUCCESS);
} catch (\Exception $e) {
// Логирование ошибки
AddMessageToLog($e->getMessage(), 'OrderService');
return new EventResult(EventResult::ERROR);
}
}
private static function sendToCRM(int $orderId): void
{
// Логика отправки в CRM
}
private static function updateWarehouse(int $orderId): void
{
// Логика обновления склада
}
}
Регистрация обработчика события
<?php
// /local/php_interface/events.php
use Bitrix\Main\EventManager;
use Project\Services\OrderService;
$eventManager = EventManager::getInstance();
// Событие сохранения заказа
$eventManager->addEventHandler('sale', 'OnOrderSave', [
OrderService::class,
'onOrderSaved'
]);
PSR-4 структура
/local/php_interface/
├── init.php # Точка входа
├── constants.php # Константы
├── autoload.php # Автозагрузка
├── events.php # События
└── lib/
├── Services/
│ ├── OrderService.php # namespace Project\Services
│ └── PaymentService.php
├── Helpers/
│ ├── Catalog.php # namespace Project\Helpers
│ └── Formatter.php
└── Utils/
└── Logger.php # namespace Project\Utils
Пример класса с namespace
<?php
// /local/php_interface/lib/Helpers/Catalog.php
namespace Project\Helpers;
use Bitrix\Iblock\ElementTable;
use Bitrix\Main\ORM\Data\DataManager;
class Catalog
{
/**
* Получить элемент инфоблока по ID
*
* @param int $elementId
* @param int $iblockId
* @return array|null
*/
public static function getElementById(
int $elementId,
int $iblockId
): ?array {
$result = ElementTable::getList([
'filter' => [
'=ID' => $elementId,
'=IBLOCK_ID' => $iblockId,
],
'select' => ['ID', 'NAME', 'DETAIL_TEXT', 'PREVIEW_PICTURE'],
]);
return $result->fetch();
}
/**
* Получить список элементов с пагинацией
*
* @param int $iblockId
* @param int $limit
* @param int $offset
* @return array
*/
public static function getElementList(
int $iblockId,
int $limit = 20,
int $offset = 0
): array {
$result = ElementTable::getList([
'filter' => [
'=IBLOCK_ID' => $iblockId,
'=ACTIVE' => true,
],
'select' => ['ID', 'NAME', 'DETAIL_PAGE_URL'],
'limit' => $limit,
'offset' => $offset,
'order' => ['SORT' => 'ASC', 'ID' => 'DESC'],
]);
return $result->fetchAll();
}
}
Использование в коде
<?php
// В любом месте после init.php
use Project\Services\OrderService;
use Project\Helpers\Catalog;
// Использование сервиса
$orderData = ['ID' => 123, 'STATUS' => 'PAID'];
OrderService::onOrderSaved(new \Bitrix\Main\Event('sale', 'OnOrderSave', $orderData));
// Использование хелпера
$element = Catalog::getElementById(456, 1);
if ($element) {
echo $element['NAME'];
}
Типичные ошибки
- ❌ Не подключён autoload.php — классы не находятся
- ❌ Несоответствие namespace и пути —
namespace Project\Servicesно файл в/lib/Helpers/ - ❌ Подключение до constants.php — константы ещё не определены
- ❌ Нет
usestatements — классы не импортированы - ❌ Прямое включение файлов — вместо автозагрузки
Best practices
- ✅ PSR-4 структура — namespace соответствует пути к файлу
- ✅ Один класс на файл — имя файла = имя класса
- ✅ Автозагрузка в init.php — после constants.php, до events.php
- ✅ Типизация — объявляйте типы параметров и возвращаемых значений
- ✅ Логирование ошибок — AddMessageToLog для отладки
Где применять
- Bitrix projects: /local/php_interface/lib для бизнес-логики
- Custom modules: вынос логики из шаблонов в сервисы
- Event handlers: обработчики событий с отдельными классами
- D7 migration: переход с процедурного кода на ООП
Связанные сниппеты:
Документация: