Yandex Metrika
sanches.free

Контекст текущего запроса в Bitrix D7: \Bitrix\Main\Context, Request и локаль

Зачем нужен Context

В модуле main класс Bitrix\Main\Context описывает один проход скрипта: входящий HTTP-запрос, объект ответа, снимок окружения сервера и привязка к символьному коду сайта и языковым настройкам. Это предпочтительнее сборки данных из разрозненных глобальных массивов: API ядра стабильнее при обновлениях и лучше стыкуется с тестами.

Получить контекст

На практике оба способа ведут к одному активному экземпляру в рамках хита:

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

$pageFlow = Context::getCurrent();
$pageFlow = Application::getInstance()->getContext();

Выбирайте ту форму записи, которая лучше читается в месте вызова: статический метод короче там, где не нужна ссылка на приложение целиком.

Запрос, ответ и Server

С трёх этих объектов собирают типовые сценарии: параметры строки запроса, установка статусов и заголовков, добавление cookie, доступ к переменным вроде DOCUMENT_ROOT.

$pageFlow = Context::getCurrent();

$httpIn = $pageFlow->getRequest();
$httpOut = $pageFlow->getResponse();
$runtime = $pageFlow->getServer();

Подробный разбор HttpRequest логично вынести в отдельную заметку: здесь достаточно помнить, что через getRequest() приходит единый фасад над GET/POST, файлами и cookie.

Сайт и язык

Код текущего сайта и языковой код часто задают фильтры в ORM или выбор вкладок мультисайта:

$pageFlow = Context::getCurrent();

$siteCode = $pageFlow->getSite();   // например s1
$langCode = $pageFlow->getLanguage(); // например ru

$pageFlow->setSite("s1");
$pageFlow->setLanguage("ru");

Смену setSite и setLanguage имеет смысл применять осознанно: от выбора сайта зависят пути данных и настройки, а ошибки на этом слое дают неочевидные баги во встраиваемом коде.

Региональные форматы через Culture

Объект Culture хранит шаблоны даты, времени и представления имени. Его можно прочитать и при необходимости подменить только на время обработки фрагмента логики:

use Bitrix\Main\Context;
use Bitrix\Main\Context\Culture;

$pageFlow = Context::getCurrent();
$formats = $pageFlow->getCulture();

$bespokeFormats = new Culture([
    "FORMAT_DATE" => "m/d/Y",
    "FORMAT_DATETIME" => "m/d/Y H:i:s",
    "FORMAT_NAME" => "#LAST_NAME#, #NAME#",
    "CHARSET" => "UTF-8",
    "DIRECTION" => "Y",
    "WEEK_START" => 1,
]);
$pageFlow->setCulture($bespokeFormats);

На продакшене избегайте «вечной» подмены культуры глобально без понимания эффекта на типовые компоненты и кешируемые куски шаблонов.

Ответ клиенту

После добавления заголовков и cookie финальный ответ отправляет слой приложения при завершении хита; в одноразовых сценариях с RestartBuffer() важно помнить, что часть уже накопленного вывода может быть потеряна до записи заголовков — это общее правило для PHP, не только для Битрикс.

Смежные темы и осторожности

  • В связке с объектом приложения см. общий обзор Application и Context; там же обычно разбирают соединение с БД и отличие «процесса» от «одного запроса».
  • В агентах и cron-скриптах HTTP-контекст может быть урезанным: прежде чем читать куки или хост, проверяйте, что сценарий действительно исполняется в веб-окружении.
  • Для разбора URL и редиректов используйте специализированные классы ядра вместо ручного склеивания строк из $_SERVER.

Итог

Context::getCurrent() — короткий вход к getRequest(), getResponse(), getServer(), коду сайта, языку и объекту культуры. Держите эту связку в памяти, и большая часть «инфраструктурных» задач во встройках становится последовательной и переносимой между версиями ядра.

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

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

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