PHP
#bitrix#php#local#php_interface#autoload#Loader#d7#psr-4

Bitrix /local: autoload.php — автозагрузка классов из lib

Регистрация классов /local/php_interface/lib через Loader::registerAutoLoadClasses. PSR-4, без Composer.

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

  1. Разместите файл в /local/php_interface/autoload.php
  2. Подключите из init.php после constants.php
  3. Классы в /local/php_interface/lib/ с namespace Project\
  4. Соблюдайте 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 — константы ещё не определены
  • Нет use statements — классы не импортированы
  • Прямое включение файлов — вместо автозагрузки

Best practices

  • PSR-4 структура — namespace соответствует пути к файлу
  • Один класс на файл — имя файла = имя класса
  • Автозагрузка в init.php — после constants.php, до events.php
  • Типизация — объявляйте типы параметров и возвращаемых значений
  • Логирование ошибок — AddMessageToLog для отладки

Где применять

  • Bitrix projects: /local/php_interface/lib для бизнес-логики
  • Custom modules: вынос логики из шаблонов в сервисы
  • Event handlers: обработчики событий с отдельными классами
  • D7 migration: переход с процедурного кода на ООП

Связанные сниппеты:

Документация: