Работа с Highload-блоками по имени вместо ID
Продолжаем тему избавления кодовой базы от ID при работе с сущностями Битрикс.
Проблема
Типичный код работы с Highload-блоками содержит жёстко прописанные ID:
<?php
// Антипаттерн: ID зашит в код
$hlblock = HighloadBlockTable::getById(5)->fetch();
$entity = HighloadBlockTable::compileEntity($hlblock);
ID Highload-блока различается между окружениями: на dev-сервере это 5, на production — 12. При переносе кода приходится менять значения вручную или использовать конфигурационные файлы. Ситуация усугубляется, когда ID разбросаны по десяткам файлов проекта.
Решение
Метод HighloadBlockTable::resolveHighloadblock() принимает символьное имя HL-блока вместо числового ID. Имя задаётся при создании блока и остаётся неизменным при переносе между окружениями.
<?php
use Bitrix\Highloadblock\HighloadBlockTable;
use Bitrix\Main\Loader;
Loader::includeModule('highloadblock');
// Правильно: используем символьное имя
$hlblock = HighloadBlockTable::resolveHighloadblock('Cities');
if ($hlblock !== null) {
$entity = HighloadBlockTable::compileEntity($hlblock);
$entityClass = $entity->getDataClass();
$items = $entityClass::getList([
'filter' => ['=UF_ACTIVE' => 1]
])->fetchAll();
}
Метод compileEntity также поддерживает имя
Символьное имя можно передавать напрямую в compileEntity() — метод внутри вызывает resolveHighloadblock():
<?php
// Компиляция entity по имени — без промежуточных вызовов
$entity = HighloadBlockTable::compileEntity('Cities');
$entityClass = $entity->getDataClass();
$cities = $entityClass::getList()->fetchAll();
Константы для имён HL-блоков
Для централизованного управления именами создайте класс с константами:
<?php
namespace App\Reference;
class HLBlock
{
public const CITIES = 'Cities';
public const REGIONS = 'Regions';
public const COLORS = 'ProductColors';
public const SIZES = 'ProductSizes';
}
Использование в коде:
<?php
use App\Reference\HLBlock;
$entity = HighloadBlockTable::compileEntity(HLBlock::CITIES);
$entityClass = $entity->getDataClass();
При таком подходе IDE подсказывает доступные HL-блоки, а опечатки выявляются на этапе статического анализа.
Встроенное кеширование
Метод resolveHighloadblock() кеширует результат запроса на 24 часа. Повторные вызовы с тем же именем не обращаются к базе данных:
<?php
// Первый вызов — запрос к БД, результат кешируется
$hlblock1 = HighloadBlockTable::resolveHighloadblock('Cities');
// Повторный вызов — данные из кеша ORM
$hlblock2 = HighloadBlockTable::resolveHighloadblock('Cities');
Валидация имени
Метод проверяет корректность символьного имени регулярным выражением /^[a-z0-9_]+$/i. При несуществующем или некорректном имени возвращается null:
<?php
$hlblock = HighloadBlockTable::resolveHighloadblock('NonExistent');
// $hlblock === null
Итог
Замените числовые ID на символьные имена HL-блоков через resolveHighloadblock(). Код станет переносимым между окружениями без ручных правок, а централизованные константы обеспечат контроль над используемыми справочниками.
Похожие советы