maximaster/tools.finder

该包最新版本(v1.0.2)没有提供许可证信息。

简化1С-Битрикс中不同实体标识符搜索的库

v1.0.2 2023-06-13 12:45 UTC

This package is auto-updated.

Last update: 2024-09-13 15:28:24 UTC


README

该库提供从数据库中选择不同实体标识符的功能。这需要将代码与使用标识符的需求分离,这在通常情况下很常见。

该库全局由3个部分组成

  • 所有Finder的抽象类
  • 以下实体的Finder实现
    • 信息块
    • 信息块属性
    • 信息块“列表”属性值
    • 信息块分区
    • HiLoad块
    • 用户组
    • 价格类型
    • 订单属性
  • 事件处理器,用于CRUD操作更改实体以更新缓存

使用示例

使用功能的主要入口点是 get()getId() 方法。每个Finder实现的具体实体这些方法包含不同的参数列表(请参阅phpDoc以获取详细信息)。例如,对于信息块,这些方法需要传递信息块类型的字符串标识符以及信息块的符号代码。

\Maximaster\Tools\Finder\Iblock::get('catalog', 'products');

而信息块分区的 get() 方法将具有不同的参数集,具体为信息块标识符和分区符号代码。如果您想引用信息块目录中的某个分区,可以使用以下示例

\Maximaster\Tools\Finder\IblockSection::get(
    \Maximaster\Tools\Finder\Iblock::get('catalog', 'products'),
    'section_code'
);

get() 方法获取实体信息数组。其中可能包含各种字段,未来可能会包含实体的所有字段。 getId() 方法仅获取实体的数值标识符

更有效地处理标识符

为了简化工作,建议创建自己的快捷方式,通过继承特定Finder的实现。例如,对于信息块,可以创建自己的类 \Vendor\Finder\Iblock,继承自信息块Finder的私有实现 \Maximaster\Tools\Finder\Iblock,并在其中实现快速访问不同信息块的方法。例如,对于相同的目录

namespace Vendor\Finder;

class Iblock extends \Maximaster\Tools\Finder\Iblock 
{
    public static function catalog()
    {
        return static::get('catalog', 'products')
    }
}

实现自己的Finder

为创建特定实体的Finder,需要继承 AbstractFinder 并实现几个方法

  • 抽象方法 getAdditionalCachePath(),它将返回一个字符串。此字符串将用于构建Finder特定实体的缓存地址
  • 抽象方法 requireModules()。它应该返回一个数组,包含在Finder使用时需要连接的模块
  • 方法 query()。此方法应执行两个操作
    1. 生成 \Bitrix\Main\Entity\Query 实例并返回它。在构建查询时需要仔细思考。没有意义在特定实体之前构建查询,最好进行更广泛的覆盖。例如,信息块Finder的内部实现选择和缓存不是单个特定信息块,而是特定类型的信息块列表。
    2. 使用 setQueryMetadata() 方法设置生成查询的元信息,具体如下
    • 将用作数组键的字段名称,其中包含此查询选择的实体列表
    • 根据此字段值从列表中选择所需实体的值
    • 此查询缓存依赖的其他参数数组。为了详细了解,最好查看该库中特定Finder的实现,实际上所有这些都比看起来简单。
  • 此外,可以实现 get()getId() 方法,以便IDE的自动补全功能能够正确工作,因为最初这些方法可以接受任意数量的参数
  • 有重新定义 getItems() 方法的可能性。该方法接收由 query() 生成的查询请求以及查询请求的元信息中的键名称。在此方法中,您可以影响存储在缓存中的数据结构。例如,可以参考 AbstrractFinder 的实现。

除了选择从数据库中获取数据的 Finder 类本身外,还需要实现数据更改时的数据清理方法。例如,如果信息块更改其代码,则显然需要使缓存失效,否则您无法通过其实际的符号代码获取实体标识符。为此,需要创建一组 OnAddOnUpdateOnDelete 处理器,这些处理器将更新所选实体的缓存。要使缓存失效,需要使用 AbstractFinder::invalidateCache() 方法。可以通过查看该库的 src/EventHandlers 目录中的类来获取示例。库中的所有事件处理器都通过 maximaster/tools.events 连接。

WTF。为什么是静态的?

因为 ... Bitrix 是一个静态的单例全局怪物。只有当他给 ServiceLocator 模式工作的机会时,我们再讨论这个问题。