Magento 2: ¿cuál es el parámetro constructor de matriz de datos $?


21

Entonces noté que en la mayoría de los modelos y bloques, esto se array $data = []da como el último parámetro del constructor .

Por ejemplo \Magento\Catalog\Block\Product\ListProduct

public function __construct(
    \Magento\Catalog\Block\Product\Context $context,
    \Magento\Framework\Data\Helper\PostHelper $postDataHelper,
    \Magento\Catalog\Model\Layer\Resolver $layerResolver,
    CategoryRepositoryInterface $categoryRepository,
    \Magento\Framework\Url\Helper\Data $urlHelper,
    array $data = []
) {
    $this->_catalogLayer = $layerResolver->get();
    $this->_postDataHelper = $postDataHelper;
    $this->categoryRepository = $categoryRepository;
    $this->urlHelper = $urlHelper;
    parent::__construct(
        $context,
        $data
    );
}

También sé que, cuando se trata de preferencias, aún debe mantener ese parámetro al final de su lista de parámetros del constructor cuando agrega más parámetros que el constructor original.

Entonces tengo varias preguntas con respecto a esta matriz :

  • Qué es ?
  • cómo usarlo ?
  • ¿Por qué debemos mantenerlo al final de la lista de parámetros del constructor al declarar preferencias para un bloque que agrega más parámetros?

Respuestas:


13

Se $datapuede usar para llenar datos en su objeto ya que el constructor de \Magento\Framework\DataObjectes esto

public function __construct(array $data = [])
{
    $this->_data = $data;
}

o similar para Magento\Framework\Api\AbstractSimpleObject

/**
 * Initialize internal storage
 *
 * @param array $data
 */
public function __construct(array $data = [])
{
    $this->_data = $data;
}

de las cuales se extienden muchas clases en Magento.

Un uso común es en conjunción con una fábrica. Por ejemplo en Magento\Sales\Model\Order\CustomerManagementtenemos:

$this->addressFactory->create(['data' => $addressData]);

que esencialmente llena la $datamatriz en la creación.

Tener que mantener $data = []al final de la lista de parámetros es un comportamiento php normal ya que está asignando un valor predeterminado: la matriz vacía.


16

El $data[]puede ser usado para mantener valores pasados ​​del di.xmlmecanismo de reemplazo de argumentos, cuando están \Magento\Catalog\Block\Product\ListProductintactos.

En su caso, esto podría ser poblado por

<type name="\Magento\Catalog\Block\Product\ListProduct">
         <arguments>
             <argument name="data" xsi:type="array">
                 <item name="0" xsi:type="string">anystring</item>
                 <item name="1" xsi:type="string">xyz</item>
                <item name="2" xsi:type="string">abs</item>
            </argument>
         </arguments>
     </type>

Incluso puede pasar objetos y otros formatos a una matriz utilizando el mecanismo di anterior . Además, puede usar esos argumentos mientras extiende la funcionalidad. Podemos decir, es una especie de va_listen c.

Esto se puede usar cuando no desea modificar el número de argumentos en un constructor y desea inyectar otras clases en sus funcionalidades extendidas.


¿Y cómo obtenemos los datos de esa matriz de datos $? ¿Puedes compartir un ejemplo existente o algo?
Kingshuk Deb
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.