Jak stworzyć obiekt varien w Magento 2?

16

W Magento 1 możemy stworzyć taki obiekt

$collection = new Varien_Data_Collection(); 
$varienObject = new Varien_Object();
$varienObject->setData($data);
$varienObject->setItem($item);
$collection->addItem($varienObject);

Jak stworzyć obiekt w Magento 2?

ND17
źródło

Odpowiedzi:

32

W Magento 2 Varien_Objectodpowiednikiem jest \Magento\Framework\DataObject.Nazwa klasy została zmieniona z Object na DataObject, ponieważ obiekt jest słowem zastrzeżonym w PHP 7. Więc możesz użyć czegoś takiego:

$obj = new \Magento\Framework\DataObject();
$obj->setItem($item);

Aktualizacja 2018

Ta odpowiedź miała na celu zilustrowanie odpowiedzi na pierwotne pytanie w możliwie najbardziej zwięzły sposób, a nie w kontekście prawdziwego kodu. Mimo że odpowiedział na pytanie, \Magento\Framework\DataObjectjest nowy Varien_Object, wdrożenie nie było w 100% zgodne z najlepszą praktyką Magento 2. Jak wskazał @MatthiasKleine, najlepszą praktyką Magento 2 do tworzenia obiektów w kodzie jest użycie frameworku Magentos DI, aby wstrzyknąć fabrykę do klasy za pomocą konstruktora i użyć tej fabryki do stworzenia obiektu. Mając to na uwadze, użycie DI do utworzenia obiektu DataObject we własnym kodzie powinno wyglądać mniej więcej tak:

namespace My/Module;

class Example {
    private $objectFactory;

    public function __construct(
        \Magento\Framework\DataObjectFactory $objectFactory
    ) {
        $this->objectFactory = $objectFactory;
        parent::__construct();
    }

    public function doSomething($item)
    {
        $obj = $this->objectFactory->create();
        $obj->setData('item', $item);
        //or
        $obj->setItem($item);
    }
}
Andrew Kett
źródło
1
Powoduje to ostrzeżenie podczas uruchamiania „phpcs --standard = MEQP2”: Bezpośrednia instancja obiektu (obiekt \ Magento \ Framework \ DataObject) jest odradzana w Magento 2.
Jeroen Vermeulen - MageHost
1
@ JeroenVermeulen-MageHost racja, ale to tylko ostrzeżenie , aby uświadomić sobie potencjalny błąd. W tym przypadku DataObjecttwierdzę, że zastrzyk zależności i fabryki nie przynoszą żadnych korzyści. W końcu to tylko uwielbiony zestaw.
Fabian Schmengler,
Jak przypisać wartość wielu tablic w obiekcie? @Andrew
Dhaduk Mitesh
Lepiej będzie użyć $obj->setData($item)zamiast tego. W $obj->setItem($item)ten sposób będziesz mógł uzyskać dowolną wartość pola $objbezpośredniego użycia metody. Jak $obj->getName()itp.
Patrick W
13

Zamiast tworzyć obiekt za pomocą „nowego” należy użyć DI (wstrzykiwanie zależności) w celu wstrzyknięcia klasy Factory i użyć tej fabryki do utworzenia nowych instancji DataObjects.

/**
 * @var \Magento\Framework\DataObjectFactory
 */
private $dataObjectFactory;

public function __construct(
    // ...
    \Magento\Framework\DataObjectFactory $dataObjectFactory
) {
    parent::__construct();

    $this->dataObjectFactory = $dataObjectFactory;
}

public function yourCode()
{
    $dataObject = $this->dataObjectFactory->create();
}
Matthias Kleine
źródło
1
Ten sposób jest prawidłowym sposobem deklarowania obiektu danych, jeśli przestrzegasz standardu kodowania, takiego jak MEQP / MEQP2 / PSR itp ... Dzięki ...
Bhavik
Bardzo dziękuję -): Działa jak dla mnie urok.
Charvi Parikh
Jak przypisać wartość wielu tablic w obiekcie? @Matthias
Dhaduk Mitesh