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
);
}
Я также знаю, что при работе с настройками вам все равно придется сохранять этот параметр в конце списка параметров вашего конструктора, когда вы добавляете больше параметров, чем исходный конструктор.
Итак, у меня есть несколько вопросов по этому поводу массив:
- что это такое?
- как им пользоваться?
- почему нам нужно хранить его в конце списка параметров конструктора при объявлении предпочтений для блока, который добавляет больше параметров?
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, так как вы присвоение значения по умолчанию - пустого массива.
$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.
Это можно использовать, если вы не хотите изменять количество аргументов в конструкторе и хотите добавить другие классы в свои расширенные функциональные возможности.