Come creare un oggetto varien in magento 2?


16

Nel magento 1 possiamo creare oggetti varien come questo

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

Come creare un oggetto in Magento 2?

Risposte:


32

In Magento 2 l' Varien_Objectequivalente è \Magento\Framework\DataObject.Il nome della classe è stato cambiato da Object a DataObject perché object è una parola riservata in PHP 7. Quindi potresti usare qualcosa come:

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

Aggiornamento 2018

Questa risposta intendeva illustrare una risposta alla domanda originale nel modo più conciso possibile e non nel contesto di un esempio di codice reale. Sebbene abbia risposto alla domanda, \Magento\Framework\DataObjectè la nuova Varien_Object, l'implementazione non era al 100% in linea con le migliori pratiche di Magento 2. Come sottolineato da @MatthiasKleine, la migliore pratica di Magento 2 per creare oggetti nel tuo codice è quella di usare Magentos DI framework per iniettare una factory nella tua classe tramite il costruttore e usarla per creare il tuo oggetto. Con questo in mente, l'utilizzo di DI per creare un DataObject nel proprio codice dovrebbe essere simile al seguente:

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

1
Questo genera un avvertimento quando si esegue 'phpcs --standard = MEQP2': l'istanza di oggetti diretti (oggetto di \ Magento \ Framework \ DataObject) è sconsigliata in Magento 2.
Jeroen Vermeulen - MageHost

1
@ JeroenVermeulen-MageHost giusto, ma è solo un avvertimento , per informarti di un potenziale errore. Per il DataObject, direi che non vi è alcun vantaggio nell'iniezione di dipendenza e nelle fabbriche. Dopotutto è solo un array glorificato.
Fabian Schmengler,

Come assegnare più valori di array nell'oggetto? @Andrea
Dhaduk Mitesh,

Sarà meglio usare $obj->setData($item)invece di In $obj->setItem($item)questo modo sarai in grado di ottenere qualsiasi valore di campo $objusando direttamente il metodo. Mi piace $obj->getName()ecc.
Patrick W,

13

Invece di creare l'oggetto con "nuovo", è necessario utilizzare DI (Dependency Injection) per iniettare la classe Factory e utilizzare tale factory per creare nuove istanze di 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();
}

1
In questo modo è corretto per dichiarare l'oggetto dati, quando si seguono standard di codifica come MEQP / MEQP2 / PSR ecc ... Grazie ...
Bhavik

Grazie mille -): Funziona come un incanto per me.
Charvi Parikh

Come assegnare più valori di array nell'oggetto? @Matthias
Dhaduk Mitesh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.