Magento 2: qual é o parâmetro construtor $ data array?

21

Então eu notei que na maioria dos modelos e blocos, existe esse array $data = []dado como o último parâmetro do construtor .

Por exemplo \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
    );
}

Eu também sei que, ao lidar com preferências, você ainda precisa manter esse parâmetro no final da sua lista de parâmetros do construtor ao adicionar mais parâmetros que o construtor original.

Então, eu tenho várias perguntas sobre essa matriz :

  • O que é isso ?
  • como usá-lo ?
  • por que precisamos mantê-lo no final da lista de parâmetros do construtor ao declarar preferências para um bloco que adiciona mais parâmetros?
Raphael na Digital Pianism
fonte

Respostas:

13

O $datapode ser usado para dados de preenchimento em seu objeto desde o construtor \Magento\Framework\DataObjecté este

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

ou similar para Magento\Framework\Api\AbstractSimpleObject

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

de onde muitas classes no Magento se estendem.

Um uso comum é em conjunto com uma fábrica. Por exemplo Magento\Sales\Model\Order\CustomerManagement, temos:

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

que essencialmente preenche a $datamatriz na criação.

Ter que manter o $data = []final da lista de parâmetros é um comportamento php normal, pois você está atribuindo um valor padrão - a matriz vazia.

Kristof na Fooman
fonte
16

O $data[]pode ser usado para valores de espera passados de di.xmlmecanismo de substituição argumentos, quando \Magento\Catalog\Block\Product\ListProductintantiated.

No seu caso, isso pode ser preenchido 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>

Você pode até passar objetos e outros formatos para uma matriz usando o mecanismo di acima . Além disso, você pode usar esses argumentos enquanto estende a funcionalidade. Podemos dizer que é uma espécie de va_listc.

Isso pode ser usado quando você não deseja modificar o número de argumentos em um construtor e deseja injetar outras classes em suas funcionalidades estendidas.

Codrain Technolabs Pvt Ltd
fonte
E como obtemos os dados dessa matriz de dados $? Você pode compartilhar um exemplo existente ou algo assim?
Kingshuk Deb