DEV Community

Андрей Викулов (VProger)
Андрей Викулов (VProger)

Posted on • Originally published at viku-lov.ru on

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

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

Enter fullscreen mode Exit fullscreen mode

На 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';

Enter fullscreen mode Exit fullscreen mode

Включать только на 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

Enter fullscreen mode Exit fullscreen mode

Про 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,

]);

Enter fullscreen mode Exit fullscreen mode

Это 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(),

]);

Enter fullscreen mode Exit fullscreen mode

Пример 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);

Enter fullscreen mode Exit fullscreen mode

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


Пример 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(),

]);

Enter fullscreen mode Exit fullscreen mode

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


AddEventHandler('sale', 'OnSaleOrderSaved', function($event) {

d([

'eventClass' => is\_object($event) ? get\_class($event) : gettype($event),

'backtrace' => debug\_backtrace(DEBUG\_BACKTRACE\_IGNORE\_ARGS, 8),

]);

});

Enter fullscreen mode Exit fullscreen mode

Да, 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);

}

Enter fullscreen mode Exit fullscreen mode

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

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

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


Итог

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

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

Ссылки

Read more on viku-lov.ru

Top comments (0)