Yandex Metrika
sanches.free 1 просмотр

Application и Context в Bitrix D7: где живёт приложение и где данные текущего хита

Две «точки опоры»: приложение и хит

В ядре main разделение между «долго живущими» ресурсами и данными конкретного обращения к сайту явное. Класс Bitrix\Main\Application — это фасад к сервисам, которые существуют на протяжении работы процесса PHP: подключение к базе, кеш, пути к документ-корню и связанным каталогам. Объект Bitrix\Main\Context, наоборот, описывает один HTTP- или CLI-прогон: что пришло в запросе, что ответим клиенту, какие параметры окружения у этого захода.

Так меньше путаницы с $GLOBALS: сначала ищете фабричную точку Application::getInstance(), когда нужно «инфраструктурное»; когда важно «что именно пользователь отправил прямо сейчас» — опираетесь на Context::getCurrent().

Application: ресурсы, общие для сайта

Через синглтон приложения достаются соединения, таймзоны, кеширующие директории и документ-корень. Это то, что обычно не меняется от одной строки пользовательской формы к другой, пока живёт ваш скрипт.

use Bitrix\Main\Application;

$portal = Application::getInstance();
$filesystemRoot = Application::getDocumentRoot();
$dataLink = Application::getConnection();

// при необходимости — второе соединение по имени в .settings.php
$archiveLink = Application::getConnection('archive');

Не стоит плодить «своих» обёрток вокруг getInstance() без причины: ядро и так синхронизирует состояние; лишний слой только усложнит отладку.

Context: срез запроса, ответ и сервер

Контекст можно получить от приложения или статическим методом текущего хита:

use Bitrix\Main\Application;
use Bitrix\Main\Context;

$hit = Application::getInstance()->getContext();
// эквивалентно короткой форме
$hit = Context::getCurrent();

$inbound = $hit->getRequest();
$daemon = $hit->getServer();
$siteMarker = $hit->getSite();
$tongue = $hit->getLanguage();

getSite() и getLanguage() часто нужны до построения шаблонов: например, чтобы подключить нужный словарь или выбрать мультирегиональную ветку данных.

Ветка HttpRequest: параметры без ручной сборки суперглобалей

HttpRequest объединяет GET, POST, файлы и куки. Для простых ключей можно обращаться и как к массиву, но предпочтительнее явные методы: так проще читать намерение в код‑ревью.

$inbound = Context::getCurrent()->getRequest();

$needle = $inbound->get('needle');           // query или body
$segment = $inbound->getQuery('segment');
$payload = $inbound->getPost('payload');
$banner = $inbound->getFile('banner');
$sticky = $inbound->getCookie('sticky_sess');

$looksLikeAjax = $inbound->isAjaxRequest();
$adminUi = $inbound->isAdminSection();
$pathUserTyped = $inbound->getRequestUri();
$pageScript = $inbound->getRequestedPage();

Проверяйте содержательно: AJAX-эвристики иногда нужно дополнять собственными заголовками, если фронтенд их меняет.

Server: аккуратный доступ к переменным окружения

Обёртка Bitrix\Main\Server читает $_SERVER и даёт методы вида getDocumentRoot(), getHttpHost(), чтобы не рассыпать ключи строками по коду агента.

$daemon = Context::getCurrent()->getServer();

$publicTree = $daemon->getDocumentRoot();
$coreTree = $daemon->getPersonalRoot();
$hostLabel = $daemon->getHttpHost();
$forwardedProto = $daemon->get('HTTP_X_FORWARDED_PROTO');

Практические заметки

  • В фоновых сценариях (агенты, cron) часть HTTP-методов контекста бессмысленна — проверяйте окружение до логики, завязанной на куки.
  • Для тестов подменяйте контекст через API ядра, а не переписывайте суперглобалы напрямую.
  • Дважды вызывать Application::getInstance() дёшево: возвращается один и тот же экземпляр; тяжёлые операции — в сервисах, а не в обёртках вокруг геттеров.

Кратко

Application — про устойчивые сервисы процесса; Context — про конкретный запрос. Запомните пару импортов и короткую цепочку Context::getCurrent()->getRequest() / getServer(), и большинство обращений к «окружению Битрикс» станет предсказуемым.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии