จะสร้างอ็อบเจกต์ Varien ใน Magento 2 ได้อย่างไร?


16

ในวีโอไอพี 1 เราสามารถสร้างวัตถุแปรปรวนแบบนี้

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

วิธีสร้างวัตถุใน magento 2

คำตอบ:


32

ในวีโอไอพี 2 Varien_Objectเทียบเท่า\Magento\Framework\DataObject.ชื่อคลาสก็เปลี่ยนจากวัตถุที่จะ DataObject เนื่องจากวัตถุเป็นคำสงวนPHP 7ใน ดังนั้นคุณสามารถใช้สิ่งที่ชอบ:

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

อัปเดต 2018

คำตอบนี้มีวัตถุประสงค์เพื่อแสดงคำตอบของคำถามต้นฉบับด้วยวิธีที่รวบรัดที่สุดและไม่ได้อยู่ในบริบทของตัวอย่างรหัสจริง ถึงแม้ว่ามันจะตอบคำถามได้ แต่\Magento\Framework\DataObjectเป็นของใหม่Varien_Objectการใช้งานไม่ได้ 100% สอดคล้องกับแนวทางปฏิบัติที่ดีที่สุดของ Magento 2 ตามที่ @MatthiasKleine ชี้ให้เห็นว่าวิธีที่ดีที่สุดในการสร้างวัตถุในโค้ดของคุณคือการใช้เฟรมเวิร์ก Magentos DI เพื่อฉีดโรงงานเข้าไปในห้องเรียนของคุณผ่านทางตัวสร้างและใช้โรงงานเพื่อสร้างวัตถุของคุณ เมื่อพิจารณาแล้วการใช้ DI เพื่อสร้าง DataObject ในรหัสของคุณเองควรมีลักษณะดังนี้:

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
สิ่งนี้จะส่งสัญญาณเตือนเมื่อใช้งาน 'phpcs --standard = MEQP2': การสร้างอินสแตนซ์วัตถุโดยตรง (วัตถุของ \ Magento \ Framework \ DataObject) นั้นไม่ได้รับการสนับสนุนใน Magento 2
Jeroen Vermeulen - MageHost

1
@ JeroenVermeulen-Mage วิธีที่ถูกต้อง แต่เป็นเพียงคำเตือนเพื่อให้คุณตระหนักถึงข้อผิดพลาดที่อาจเกิดขึ้น สำหรับDataObjectฉันขอยืนยันว่าไม่มีประโยชน์ในการฉีดและโรงงานพึ่งพา มันเป็นเพียงอาเรย์ที่รุ่งโรจน์หลังจากทั้งหมด
เฟเบียน Schmengler

วิธีการกำหนดค่าหลายอาร์เรย์ในวัตถุ? @Andrew
Dhaduk Mitesh

มันจะดีกว่าที่จะใช้ $obj->setData($item)แทน$obj->setItem($item)วิธีนี้คุณจะสามารถรับค่าฟิลด์ใด ๆ ของ$objวิธีการใช้โดยตรง กดไลค์และ$obj->getName()อื่น ๆ
Patrick W

13

แทนที่จะสร้างวัตถุด้วย 'ใหม่' คุณควรใช้ DI (Dependency Injection) เพื่อฉีดคลาส Factory และใช้โรงงานนั้นเพื่อสร้างอินสแตนซ์ใหม่ของ 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
วิธีนี้เป็นวิธีที่ถูกต้องในการประกาศข้อมูลวัตถุเมื่อคุณทำตามมาตรฐานการเข้ารหัสเช่น MEQP / MEQP2 / PSR ฯลฯ ... ขอบคุณ ...
Bhavik

ขอบคุณมาก -): มันใช้งานได้อย่างมีเสน่ห์สำหรับฉัน
Charvi Parikh

วิธีการกำหนดค่าหลายอาร์เรย์ในวัตถุ? @Matthias
Dhaduk Mitesh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.