Magento 2: что такое параметр конструктора массива данных $?


Поэтому я заметил, что в большинстве моделей и блоков этот array $data = [] задан в качестве последнего параметра конструктора.

Например \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
    );
}

Я также знаю, что при работе с настройками вам все равно придется сохранять этот параметр в конце списка параметров вашего конструктора, когда вы добавляете больше параметров, чем исходный конструктор.

Итак, у меня есть несколько вопросов по этому поводу массив:

  • что это такое?
  • как им пользоваться?
  • почему нам нужно хранить его в конце списка параметров конструктора при объявлении предпочтений для блока, который добавляет больше параметров?
Author: Raphael at Digital Pianism, 2016-06-02

2 answers

$data можно использовать для заполнения данных вашего объекта, так как конструктор \Magento\Framework\DataObject - это

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

Или аналогичный для Magento\Framework\Api\AbstractSimpleObject

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

Из которого происходит множество классов в Magento.

Обычно используется в сочетании с фабрикой. Например, в Magento\Sales\Model\Order\CustomerManagement у нас есть:

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

, который по существу заполняет массив $data при создании.

Необходимость сохранять $data = [] в конце списка параметров является нормальным поведением php, так как вы присвоение значения по умолчанию - пустого массива.

 14
Author: Kristof at Fooman, 2016-06-02 10:52:26

$data[] может использоваться для хранения значений, переданных из механизма замены аргументов di.xml, когда \Magento\Catalog\Block\Product\ListProduct введено.

В вашем случае это может быть заполнено

<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>

Вы даже можете передавать объекты и другие форматы в массив, используя описанный выше механизм di. Кроме того, вы можете использовать эти аргументы при расширении функциональности. Мы можем сказать, что это своего рода va_list в c.

Это можно использовать, если вы не хотите изменять количество аргументов в конструкторе и хотите добавить другие классы в свои расширенные функциональные возможности.

 16
Author: Codrain Technolabs Pvt Ltd, 2016-06-02 11:27:26