Bitrix\Main\Application — центральная точка доступа
к контексту текущего выполнения в D7: запросу, ответу, сессии,
подключению к базе. Разберём, зачем нужен этот класс, если
к тем же данным можно обратиться через глобальные переменные,
и когда это действительно важно.
Получение экземпляра приложения
<?php
use Bitrix\Main\Application;
$app = Application::getInstance();
$context = $app->getContext();
Application реализован как синглтон — один экземпляр
на весь жизненный цикл обработки запроса, доступный из любой
точки кода без передачи объекта явным параметром через цепочку
вызовов функций.
Доступ к запросу через контекст
<?php
$request = Application::getInstance()->getContext()->getRequest();
$id = $request->get('id');
Это тот же объект Request, что рассмотрен отдельно, —
Application::getInstance()->getContext()->getRequest()
и более короткая запись через Context::getCurrent()->getRequest()
дают одинаковый результат, оба пути в конечном счёте ведут
к одному и тому же объекту контекста текущего выполнения.
Нужна помощь с Битрикс?
Доступ к подключению базы данных
<?php
$connection = Application::getConnection();
$result = $connection->query('SELECT COUNT(*) AS CNT FROM b_iblock_element');
$row = $result->fetch();
D7-способ получить соединение с базой данных для выполнения
SQL-запросов — аналог глобального объекта $DB
из старого API, но с объектно-ориентированным интерфейсом
и без обращения к глобальной переменной.
Управление сессией через объект приложения
<?php
$session = Application::getInstance()->getSession();
$session->set('cart_step', 2);
$value = $session->get('cart_step');
Работа с сессией через объект вместо прямого обращения
к $_SESSION даёт единообразный интерфейс, совместимый
с остальным D7-кодом, и удобнее тестируется, поскольку зависимость
от сессии выражена явным объектом, а не скрытой глобальной
переменной.
Почему не просто использовать глобальные переменные
Технически глобальные $DB, $_REQUEST,
$_SESSION продолжают работать и дают доступ к тем
же данным — но код, написанный через объект приложения и контекст,
явно выражает зависимости функции или класса от окружения выполнения,
что упрощает чтение кода и, в перспективе, облегчает написание
автоматических тестов, где контекст можно подменить контролируемым
образом вместо манипуляции реальными глобальными переменными PHP.
Контекст в консольном режиме
При запуске скрипта из консоли (cron-задача, разовый скрипт обслуживания) часть данных контекста, актуальных только для веб-запроса (например, реальный HTTP-запрос пользователя), отсутствует или имеет значения по умолчанию — код, критично зависящий от контекста веб-запроса, стоит писать с учётом того, что он может выполняться и в консольном режиме без реального HTTP-запроса за спиной.
Частые ошибки
- Смешивание обращения к глобальным переменным и к объекту приложения в одном модуле. Затрудняет понимание, какой способ доступа к контексту считается основным в проекте.
- Код полагается на данные веб-контекста при запуске из консоли. Неожиданное поведение при выполнении через cron без реального HTTP-запроса.
Итог
Bitrix\Main\Application — центральная точка доступа
к контексту D7: запросу, сессии, подключению к базе — предпочтительная
для нового кода альтернатива прямому обращению к глобальным
переменным старого API. Разница не столько в возможностях,
сколько в явности зависимостей кода от окружения выполнения
и совместимости со стилем остального D7-кода проекта.
