Wie erstelle ich ein varien Objekt in Magento 2?

16

In magento 1 können wir so ein varien Objekt erstellen

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

Wie erstelle ich ein Objekt in Magento 2?

ND17
quelle

Antworten:

32

In Magento 2 Varien_Objectlautet die Entsprechung \Magento\Framework\DataObject.Der Klassenname wurde von Object in DataObject geändert, da object ein reserviertes Wort in ist PHP 7. Sie könnten also Folgendes verwenden:

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

Update 2018

Diese Antwort sollte die Antwort auf die ursprüngliche Frage so kurz wie möglich und nicht im Kontext eines realen Codebeispiels darstellen. Obwohl es die Frage beantwortet hat, \Magento\Framework\DataObjecthandelt es sich um das Neue Varien_Object, die Implementierung entsprach nicht zu 100% den Best Practices von Magento 2. Wie @MatthiasKleine hervorhob, besteht die beste Vorgehensweise von Magento 2 zum Erstellen von Objekten in Ihrem Code darin, mithilfe des Magentos DI-Frameworks eine Factory über den Konstruktor in Ihre Klasse einzufügen und diese Factory zum Erstellen Ihres Objekts zu verwenden. In diesem Sinne sollte die Verwendung von DI zum Erstellen eines DataObject in Ihrem eigenen Code ungefähr so ​​aussehen:

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
quelle
1
Dies gibt eine Warnung aus, wenn 'phpcs --standard = MEQP2' ausgeführt wird: Direkte Objektinstanziierung (Objekt von \ Magento \ Framework \ DataObject) wird in Magento 2 nicht
empfohlen
1
@ JeroenVermeulen-MageHost richtig, aber es ist nur eine Warnung , um Sie auf einen möglichen Fehler aufmerksam zu machen . Für die DataObjectwürde ich argumentieren, dass es keinen Nutzen in Abhängigkeitsinjektion und Fabriken gibt. Es ist schließlich nur eine verherrlichte Reihe.
Fabian Schmengler
Wie kann ich dem Objekt mehrere Array-Werte zuweisen? @ Andrew
Dhaduk Mitesh
Es ist besser, $obj->setData($item)anstelle von zu verwenden. Auf $obj->setItem($item)diese Weise können Sie jeden Feldwert für $objdie direkte Verwendung der Methode abrufen. Wie $obj->getName()etc.
Patrick W
13

Anstatt das Objekt mit "new" zu erstellen, sollten Sie DI (Dependency Injection) verwenden, um die Factory-Klasse zu injizieren, und diese Factory verwenden, um neue Instanzen von DataObjects zu erstellen.

/**
 * @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
quelle
1
Dieser Weg ist der richtige Weg zum Deklarieren von Datenobjekten, wenn Sie Codierungsstandards wie MEQP / MEQP2 / PSR usw. befolgen ... Danke ...
Bhavik
Vielen Dank -): Es funktioniert wie Charme für mich.
Charvi Parikh
Wie kann ich dem Objekt mehrere Array-Werte zuweisen? @Matthias
Dhaduk Mitesh