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
    );
}

我还知道,在处理首选项时,当添加的参数比原始构造函数更多时,仍必须将该参数保留在构造函数参数列表的末尾

所以我对这个数组几个问题

  • 它是什么 ?
  • 如何使用它 ?
  • 声明添加更多参数的块的首选项时,为什么需要将其保留在构造函数参数列表的末尾?

Answers:


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的参数替代机制,当\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_listc中的一种。

当您不想修改构造函数中的参数数量并且想要在扩展功能中注入其他类时,可以使用此方法。


我们如何从$ data数组中获取数据?您能否分享现有示例或其他内容。
金斯克Deb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.