Bagaimana cara membuat objek varien di magento 2?

16

Di magento 1 kita dapat membuat objek varien seperti ini

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

Bagaimana cara membuat objek di magento 2?

ND17
sumber

Jawaban:

32

Dalam Magento 2 yang Varien_Objectsetara adalah \Magento\Framework\DataObject.Nama kelas berubah dari Object ke DataObject karena objek adalah kata reserved di PHP 7. Jadi Anda bisa menggunakan sesuatu seperti:

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

Perbarui 2018

Jawaban ini dimaksudkan untuk menggambarkan jawaban pertanyaan awal dengan cara yang sesingkat mungkin dan tidak dalam konteks contoh kode nyata. Meskipun menjawab pertanyaan, \Magento\Framework\DataObjectapakah ini baru Varien_Object, implementasinya tidak 100% sejalan dengan praktik terbaik Magento 2. Seperti @MatthiasKleine tunjukkan, Magento 2 praktik terbaik untuk membuat objek dalam kode Anda adalah dengan menggunakan kerangka Magentos DI untuk menyuntikkan pabrik ke kelas Anda melalui konstruktor dan menggunakan pabrik itu untuk membuat objek Anda. Dengan mengingat hal itu, menggunakan DI untuk membuat DataObject dalam kode Anda sendiri akan terlihat seperti ini:

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
sumber
1
Ini melempar peringatan ketika menjalankan 'phpcs --standard = MEQP2': Instansiasi objek langsung (objek \ Magento \ Framework \ DataObject) tidak disarankan dalam Magento 2.
Jeroen Vermeulen - MageHost
1
@ JeroenVermeulen-MageHost benar, tapi itu hanya peringatan , untuk membuat Anda menyadari kesalahan potensial . Untuk itu DataObject, saya berpendapat bahwa tidak ada manfaat dalam injeksi ketergantungan dan pabrik. Bagaimanapun, ini hanyalah array yang dimuliakan.
Fabian Schmengler
Bagaimana cara menetapkan nilai array ganda pada objek? @ Andrew
Dhaduk Mitesh
Ini akan lebih baik untuk digunakan $obj->setData($item)daripada $obj->setItem($item)dengan cara ini Anda akan bisa mendapatkan nilai bidang $objmenggunakan metode secara langsung. Seperti $obj->getName()dll.
Patrick W
13

Alih-alih membuat objek dengan 'baru' Anda harus menggunakan DI (Dependency Injection) untuk menyuntikkan kelas Factory dan menggunakan pabrik itu untuk membuat instance baru dari 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
sumber
1
Cara ini adalah cara yang benar untuk mendeklarasikan objek data, ketika Anda mengikuti standar pengkodean seperti MEQP / MEQP2 / PSR dll ... Terima kasih ...
Bhavik
Terima kasih banyak -): Ini berfungsi seperti pesona bagi saya.
Charvi Parikh
Bagaimana cara menetapkan nilai array ganda pada objek? @Matthias
Dhaduk Mitesh