2

我有多个订阅 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);

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

4

1 回答 1

3

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

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

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

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

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

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

于 2022-01-26T06:50:34.243 回答