Главная » Разработка Битрикс » D7 » Bitrix\Main\Application и контекст выполнения в D7

Bitrix\Main\Application и контекст выполнения в D7

Схема доступа к контексту выполнения через Bitrix Main Application в D7 Битрикс

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-кода проекта.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний