Magento 2: jaki jest parametr konstruktora tablic danych $?

21

Zauważyłem więc, że w większości modeli i bloków jest to array $data = []ostatni parametr konstruktora .

Na przykład \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
    );
}

Wiem również, że mając do czynienia z preferencjami, nadal musisz zachować ten parametr na końcu listy parametrów konstruktora, gdy dodasz więcej parametrów niż oryginalny konstruktor.

Mam więc kilka pytań dotyczących tej tablicy :

  • co to jest ?
  • Jak tego użyć ?
  • dlaczego musimy zachować go na końcu listy parametrów konstruktora, deklarując preferencje dla bloku, który dodaje więcej parametrów?
Raphael at Digital Pianism
źródło

Odpowiedzi:

13

$dataMożna stosować do wypełniania danych na obiekcie od konstruktora \Magento\Framework\DataObjectjest to

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

lub podobny dla Magento\Framework\Api\AbstractSimpleObject

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

od których pochodzi wiele klas w Magento.

Powszechne zastosowanie jest w połączeniu z fabryką. Na przykład w Magento\Sales\Model\Order\CustomerManagementmamy:

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

który zasadniczo wypełnia $datatablicę podczas tworzenia.

Konieczność trzymania $data = []na końcu listy parametrów to normalne zachowanie php, ponieważ przypisujesz wartość domyślną - pustą tablicę.

Kristof w Fooman
źródło
16

$data[]Mogą być wykorzystane do wartości ładowni upłynęły od di.xml„s mechanizmu zastępczego argumenty, kiedy \Magento\Catalog\Block\Product\ListProductintantiated.

W twoim przypadku może to być wypełnione przez

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

Możesz nawet przekazywać obiekty i inne formaty do tablicy za pomocą powyższego mechanizmu di . Ponadto możesz użyć tych argumentów, rozszerzając funkcjonalność. Można powiedzieć, że jest to rodzaj va_listc.

Można tego użyć, gdy nie chcesz modyfikować liczby argumentów w konstruktorze i chcesz wstrzyknąć inne klasy do swoich rozszerzonych funkcjonalności.

Codrain Technolabs Pvt Ltd
źródło
I w jaki sposób otrzymujemy dane z tej tablicy $ $ data? Czy możesz podzielić się istniejącym przykładem lub czymkolwiek.
Kingshuk Deb