Shopware 6 如何正确添加数组作为 SearchResult 的扩展

Shopware 6 How do I correctly add an array as extensions to SearchResult

我有多个工作订阅者 类 订阅 ProductListingResultEvent,添加一个数组作为结果的扩展。

代码看起来像这样:

$myExampleArray = [
    ['key' => 'foobar', 'val1' => 'bar', 'val2' => 'foobarfoo'],
    ['key' => 'barfoo', 'val1' => 'foo', 'val2' => 'barfoobar']
];
$myStructCollection = new StructCollection();
foreach ($myExampleArray as $myExampleElement)
{
    $myStructCollection->set($myExampleElement['key'], $myExampleElement);
}
$event->getResult()->addExtension('myExampleExtension', $myStructCollection);

这是正确的做法吗?我是否总是必须实例化一个新的结构来添加数据作为扩展?

是的,您总是必须实例化一个新的 Struct-Class,因为您要添加的 extension-struct 应该独立于核心或其他插件,因此它们不会干扰您的逻辑,并且可能覆盖内容,例如

因此,您应该始终在扩展的命名中使用您的供应商前缀,以确保与其他插件没有命名冲突。

对于您所描述的情况,有一个特殊的 ArrayStruct 可以用来更轻松地为数组创建结构。然而,数组结构期望输入数组由键索引,因此您可能需要稍微更改数组数据的结构:

$myExampleArray = [
    'foobar' => ['key' => 'foobar', 'val1' => 'bar', 'val2' => 'foobarfoo'],
    'barfoo' => ['key' => 'barfoo', 'val1' => 'foo', 'val2' => 'barfoobar']
];

$event->getResult()->addExtension('myExampleExtension', new ArrayStruct($myExampleArray);

如果更改数组的结构不是那么容易,您的解决方案也完全没问题,但根据数组的大小,您可能希望摆脱额外的循环。