Làm thế nào để tạo đối tượng varien trong magento 2?


16

Trong magento 1 chúng ta có thể tạo đối tượng varien như thế này

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

Làm thế nào để tạo đối tượng trong magento 2?

Câu trả lời:


32

Trong Magento 2 Varien_Objecttương đương là \Magento\Framework\DataObject.Tên lớp đã được thay đổi từ Object thành DataObject vì đối tượng là một từ dành riêng trong PHP 7. Vì vậy, bạn có thể sử dụng một cái gì đó như:

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

Cập nhật 2018

Câu trả lời này nhằm minh họa một câu trả lời cho câu hỏi ban đầu theo cách cô đọng nhất có thể và không phải trong bối cảnh của một ví dụ mã thực. Mặc dù nó đã trả lời câu hỏi, \Magento\Framework\DataObjectlà cái mới Varien_Object, nhưng việc triển khai không phù hợp với thực tiễn tốt nhất của Magento 2. Như @MatthiasKleine đã chỉ ra, Magento 2 cách tốt nhất để tạo các đối tượng trong mã của bạn là sử dụng khung Magentos DI để đưa một nhà máy vào lớp của bạn thông qua hàm tạo và sử dụng nhà máy đó để tạo đối tượng của bạn. Với ý nghĩ đó, sử dụng DI để tạo DataObject trong mã của riêng bạn sẽ trông giống như thế này:

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
Điều này đưa ra một cảnh báo khi chạy 'phpcs --st Chuẩn = MEQP2': Khởi tạo đối tượng trực tiếp (đối tượng của \ Magento \ Framework \ DataObject) không được khuyến khích trong Magento 2.
Jeroen Vermeulen - Magehost

1
@ JeroenVermeulen-Magehost đúng, nhưng đó chỉ là một cảnh báo , để bạn biết về một lỗi tiềm ẩn . Đối với DataObject, tôi cho rằng không có lợi ích gì trong các nhà máy và nhà máy tiêm phụ thuộc. Rốt cuộc nó chỉ là một mảng vinh quang.
Fabian Schmengler

Làm thế nào để gán nhiều giá trị mảng trong đối tượng? @ Andrew
Dhaduk Mitesh

Sẽ tốt hơn khi sử dụng $obj->setData($item)thay vì $obj->setItem($item)theo cách này, bạn sẽ có thể nhận được bất kỳ giá trị trường nào của $objphương thức sử dụng trực tiếp. Giống như $obj->getName()vv
Patrick W

13

Thay vì tạo đối tượng bằng 'mới', bạn nên sử dụng DI (Dependency Injection) để tiêm lớp Factory và sử dụng nhà máy đó để tạo các phiên bản mới của 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
Cách này là cách chính xác để khai báo đối tượng dữ liệu, khi bạn tuân theo tiêu chuẩn mã hóa như MEQP / MEQP2 / PSR, v.v ... Cảm ơn ...
Bhasta

Cảm ơn rất nhiều -): Nó hoạt động như sự quyến rũ đối với tôi.
Charvi Parikh

Làm thế nào để gán nhiều giá trị mảng trong đối tượng? @Matthias
Dhaduk Mitesh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.