maximaster/tools.finder
Composer 安装命令:
composer require maximaster/tools.finder
包简介
Библиотека, облегчающая поиск идентификаторов разных сущностей для 1С-Битрикс
README 文档
README
Библиотека предоставляет функционал для выборки из БД идентификаторов различных сущностей Битрикс. Это необходимо, чтобы отвязать свой код от хардкода идентификаторов.
Библиотека состоит глобально из 3х частей:
- Абстрактный класс для всех Finder'ов
- Реализация Finder'ов для следующих сущностей:
- Инфоблок
- Свойство инфоблока
- Значение свойства типа "Список" инфоблока
- Раздел инфоблока
- Highload-блок
- Группа пользователей
- Тип цены
- Свойство заказа
- Смарт-процесс CRM
- Обработчики событий на CRUD-операции с сущностями для инвалидации кеша
Пример использования
Основными входными точками являются методы get() и getId(). У каждой реализации Finder'а они имеют разный набор параметров (см. phpDoc).
Например, для инфоблока нужно передать тип и символьный код:
\Maximaster\Tools\Finder\Iblock::get('catalog', 'products');
Для раздела инфоблока — идентификатор инфоблока и символьный код раздела:
\Maximaster\Tools\Finder\IblockSection::get( \Maximaster\Tools\Finder\Iblock::getId('catalog', 'products'), 'section_code' );
get() возвращает массив с данными сущности, getId() — только числовой идентификатор.
Все доступные Finder'ы
| Класс | Сущность | Параметры get() |
|---|---|---|
Iblock |
Инфоблок | (string $type, string $code) |
IblockProperty |
Свойство инфоблока | (int $iblockId, string $code) |
IblockPropertyEnum |
Значение свойства типа "Список" | (int $propertyId, string $enumCode) |
IblockSection |
Раздел инфоблока | (int $iblockId, string $sectionCode) |
HlBlock |
Highload-блок | (string $name) |
UserGroup |
Группа пользователей | (string $stringId) |
PriceType |
Тип цены | (string $name) |
OrderProperty |
Свойство заказа | (int $personTypeId, string $propertyCode) |
SmartProcess |
Смарт-процесс CRM | (string $name) |
Для SmartProcess дополнительно доступен метод getEntityId(string $name): int, возвращающий ENTITY_TYPE_ID.
Шорткаты
Для удобства имеет смысл создать собственные шорткаты, унаследовавшись от реализаций Finder'ов:
namespace Vendor\Finder; class Iblock extends \Maximaster\Tools\Finder\Iblock { public static function catalog(): array { return static::get('catalog', 'products'); } }
Кеширование
Библиотека использует двухуровневый кеш:
- In-memory кеш — хранит данные в статическом массиве в рамках текущего запроса (предотвращает повторное чтение диска)
- Файловый кеш — стандартный кеш Битрикс, TTL 24 часа
Кеш инвалидируется автоматически через обработчики событий при изменении сущностей.
Реализация собственных Finder'ов
Необходимо унаследоваться от AbstractFinder и реализовать:
Обязательные абстрактные методы
protected function getAdditionalCachePath(): string
Возвращает строку-суффикс пути кеша. Например: /iblock, /highloadblock.
protected function requireModules(): array
Возвращает массив модулей Битрикс для загрузки. Например: ['iblock'], ['sale']. Можно вернуть пустой массив.
protected function query(...$args): \Bitrix\Main\ORM\Query\Query
Формирует ORM-запрос и вызывает setQueryMetadata(). Важно: запрос должен выбирать широкий набор сущностей (например, все инфоблоки одного типа), а не одну конкретную. Данные индексируются и кешируются целиком, нужный элемент извлекается из кеша.
Мета-информация запроса
Внутри query() необходимо вызвать:
$this->setQueryMetadata( 'CODE', // поле, по которому индексируется кеш $code, // значение для выборки из кеша [$iblockId] // shard-параметры кеша (влияют на путь кеша) );
Дополнительные возможности
- Можно переопределить
getItems(Query $q, string $keyField): arrayдля кастомизации структуры кешируемых данных (пример:PriceTypeдобавляет специальную запись для базовой цены) - Рекомендуется переопределить
get()иgetId()с явными параметрами для корректной работы автодополнения в IDE
Инвалидация кеша
Необходимо создать обработчики событий OnAfterAdd, OnAfterUpdate, OnBeforeDelete (или аналоги для конкретного модуля), которые вызывают AbstractFinder::invalidateCache():
use Maximaster\Tools\Finder\Iblock; class OnAfterIBlockUpdate { public static function handle(array $fields): void { Iblock::getInstance()->invalidateCache([$fields['IBLOCK_TYPE_ID']]); } }
Аргумент $shards в invalidateCache() должен совпадать с $shards в setQueryMetadata(). Все обработчики событий библиотеки подключаются через bootstrap.php с помощью EventManager::addEventHandlerCompatible().
За примерами см. классы в src/EventHandlers/.
Обработчики событий в поставке
| Модуль | События |
|---|---|
iblock |
OnAfterIBlockAdd, OnAfterIBlockUpdate, OnBeforeIBlockDelete |
iblock |
OnAfterIBlockPropertyAdd, OnAfterIBlockPropertyUpdate, OnBeforeIBlockPropertyDelete |
iblock |
OnAfterIBlockSectionAdd, OnAfterIBlockSectionUpdate, OnAfterIBlockSectionDelete |
main |
OnAfterGroupAdd, OnAfterGroupUpdate, OnGroupDelete |
catalog |
OnGroupAdd, OnGroupUpdate, OnGroupDelete |
sale |
OnOrderPropsAdd, OnOrderPropsUpdate, OnOrderPropsDelete |
highloadblock |
OnAdd, OnUpdate, OnDelete |
crm |
OnAfterAdd, OnAfterUpdate, OnAfterDelete (Dynamic Type) |
WTF. Почему статика?
Потому что Битрикс — статический синглтоновый глобальный монстр. Как только он даст возможность работать хотя бы в режиме ServiceLocator, тогда и поговорим.
maximaster/tools.finder 适用场景与选型建议
maximaster/tools.finder 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 8.4k 次下载、GitHub Stars 达 10, 最近一次更新时间为 2019 年 03 月 25 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 maximaster/tools.finder 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 maximaster/tools.finder 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 8.4k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 10
- 点击次数: 1
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: Unknown
- 更新时间: 2019-03-25