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


21

Итак, я заметил, что в большинстве моделей и блоков это 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
    );
}

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

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

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

Ответы:


13

$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, поскольку вы назначаете значение по умолчанию - пустой массив.


16

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

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

<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в с.

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


И как мы получаем данные из этого массива $ data? Можете ли вы поделиться существующим примером или что-нибудь.
Кингшук Деб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.