Tengo varias clases de suscriptores en funcionamiento que se suscriben a ProductListingResultEvent, que agregan una matriz como extensión al resultado.
El código se parece a esto:
$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);¿Es esa la forma correcta de hacerlo? ¿Siempre tengo que instanciar una nueva estructura para agregar datos como una extensión?
Sí, siempre tiene que crear una nueva instancia de Struct-Class, ya que la estructura de extensión que agregará debe ser independiente del núcleo u otros complementos, para que no interfieran con su lógica y puedan anular cosas, por ejemplo.
Por lo tanto, siempre debe usar el prefijo de su proveedor en el nombre de la extensión, para asegurarse de que no haya conflictos de nombres con otros complementos.
Para el caso que está describiendo, hay un ArrayStruct especial que puede usar para crear más fácilmente una estructura para una matriz. Sin embargo, la estructura de matriz espera que la clave indexe la matriz de entrada, por lo que es posible que deba cambiar un poco la estructura de los datos de su matriz:
$myExampleArray = [ 'foobar' => ['key' => 'foobar', 'val1' => 'bar', 'val2' => 'foobarfoo'], 'barfoo' => ['key' => 'barfoo', 'val1' => 'foo', 'val2' => 'barfoobar'] ]; $event->getResult()->addExtension('myExampleExtension', new ArrayStruct($myExampleArray);Si no es tan fácil cambiar la estructura de su matriz, su solución también está bien, pero dependiendo del tamaño de la matriz, es posible que desee deshacerse del bucle adicional que la atraviesa.