← Back to blog 🇷🇺 RU

Kint в Bitrix CMS: дебаг без боли вместо var_dump()

Разбираем Kint для Bitrix: зачем он нужен, как поставить через Composer в /local, как включать только на dev через update_devsrv, и 5 практических примеров под D7/ORM/Sale.

Kint в Bitrix CMS: дебаг без боли вместо var_dump()

Requirements

  • Bitrix CMS (коробка) + доступ к /local/
  • PHP 7.4+ (лучше 8.x)
  • Composer (на локалке или сервере)

Kint в Bitrix CMS: дебаг без боли вместо var_dump()

В Bitrix отладка часто выглядит как археология: var_dump($arResult); die; и молитва, чтобы это не улетело на прод. Kint — это “var_dump для людей”: раскрывающиеся структуры, поиск по дампу, нормальный вывод объектов и подсказки путей доступа к данным. На Bitrix’овых объектах (ORM, Sale, Request, Event) это экономит часы. (GitHub)

Главное правило: Kint должен быть выключен в продакшене или включаться только для разработки/твоего IP. Так и рекомендуют сами авторы. (Kint)


Почему Kint особенно хорош именно в Bitrix

Bitrix любит:

  • огромные массивы $arResult, $arParams;
  • объекты ORM/Entity/Sale, которые в var_dump() превращаются в “простыню”;
  • события, где “кто и откуда вызвал” — половина расследования.

Kint даёт:

  • читабельный вывод даже сложных объектов;
  • быстрый поиск внутри структуры;
  • удобную навигацию по вложенности (без 20 print_r подряд). (GitHub)

Установка Kint в Bitrix через Composer (правильный путь)

Ставим в /local, чтобы не трогать ядро.

1) Установить пакет

cd /path/to/site/local
composer require kint-php/kint --dev

На Packagist это официальный способ установки. (Packagist)

2) Подключить autoload

Файл: /local/php_interface/init.php (или /bitrix/php_interface/init.php, если проект старый — но обычно всё уже в /local)

<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/local/vendor/autoload.php';

Включать только на dev: Bitrix-способ через update_devsrv

В Bitrix есть штатный флаг “Установка для разработки” — это опция main:update_devsrv. Её можно проверять через D7 API \Bitrix\Main\Config\Option::get(...). (telq.org)

Файл: /local/php_interface/init.php

<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/local/vendor/autoload.php';

use Bitrix\Main\Config\Option;

$isDevInstall = (Option::get('main', 'update_devsrv', 'N') === 'Y'); // dev-установка Bitrix
$isMyIp = in_array($_SERVER['REMOTE_ADDR'] ?? '', ['127.0.0.1', '::1', 'YOUR_IP_HERE'], true);

// Рубильник Kint: true/false или режим рендера
\Kint::$enabled_mode = ($isDevInstall || $isMyIp); // в проде будет false

Про Kint::$enabled_mode и рекомендацию выключать на проде — это из официальных настроек Kint. (Kint)

Практика: dev-установка + свой IP — идеальная комбинация. Даже если кто-то случайно включил dev-флаг, ты всё равно контролируешь доступ.


База: как дампить (и не ломать проект)

Пример 1 — компонент: быстро понять, что реально в $arResult

// template.php
d([
  'PARAMS' => $arParams,
  'RESULT_KEYS' => array_keys($arResult),
  'ITEMS_COUNT' => isset($arResult['ITEMS']) ? count($arResult['ITEMS']) : null,
]);

Это 80% “почему не выводится список/фильтр/пагинация”.


Пример 2 — Request (D7): GET/POST/AJAX без гаданий

use Bitrix\Main\Application;

$request = Application::getInstance()->getContext()->getRequest();

d([
  'method' => $request->getRequestMethod(),
  'isAjax' => $request->isAjaxRequest(),
  'get'    => $request->getQueryList()->toArray(),
  'post'   => $request->getPostList()->toArray(),
]);

Пример 3 — ORM: что реально вернул getList()

use Bitrix\Main\UserTable;

$rows = UserTable::getList([
  'select' => ['ID', 'LOGIN', 'EMAIL', 'ACTIVE'],
  'filter' => ['=ACTIVE' => 'Y'],
  'limit'  => 5,
  'order'  => ['ID' => 'DESC'],
])->fetchAll();

d($rows);

Удобно, когда фильтр “почему-то не фильтрует”, а на самом деле поле/оператор не тот.


Пример 4 — Sale\Order: статусы, оплаты, отгрузки (коротко и по делу)

use Bitrix\Sale\Order;

$orderId = 123;
$order = Order::load($orderId);

d([
  'ID' => $orderId,
  'STATUS' => $order->getField('STATUS_ID'),
  'PRICE' => $order->getPrice(),
  'FIELDS' => $order->getFieldValues(),
]);

Пример 5 — события: “кто вызвал и почему два раза”

AddEventHandler('sale', 'OnSaleOrderSaved', function($event) {
  d([
    'eventClass' => is_object($event) ? get_class($event) : gettype($event),
    'backtrace'  => debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 8),
  ]);
});

Да, debug_backtrace() — старая школа, но на событиях Bitrix спасает.


Важно: Kint нельзя просто так пихать в AJAX/JSON

Kint по умолчанию пишет в вывод. Если ты дампишь в AJAX-ответ — привет “сломанный JSON”, и фронт будет плакать.

Для AJAX лучше:

  • либо условно дампить только когда это не AJAX,
  • либо писать в лог через Bitrix-инструменты.

Минимальная защита:

use Bitrix\Main\Application;

$request = Application::getInstance()->getContext()->getRequest();

if (!$request->isAjaxRequest()) {
  d($data);
}

Kint vs штатный дебаг Bitrix: что когда использовать

  • Kint — когда ты смотришь структуру данных “здесь и сейчас” (компоненты, ORM, Sale, события).
  • Логи Bitrix — когда нельзя ломать ответ (AJAX/API), или нужно оставить след на сервере.

Если хочешь “по-взрослому” закрывать тему отладки на проекте — добавь ещё логирование и мониторинг. Хорошо ложится рядом:


Итог

Если ты работаешь с Bitrix и всё ещё дебажишь var_dump + die, Kint — это апгрейд без “внедрения космических технологий”:

  • ставится за минуту через Composer,
  • включается штатно через main:update_devsrv,
  • даёт нормальный вывод D7/ORM/Sale,
  • и, главное, снижает шанс случайно вылить отладку на прод.

Ссылки

0 views

Комментарии

Загрузка комментариев...
Пока нет комментариев. Будьте первым!