如何在magento 2中创建变体对象?


16

在magento 1中,我们可以像这样创建varien对象

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

如何在magento 2中创建对象?

Answers:


32

在Magento 2 Varien_Object当量的\Magento\Framework\DataObject.类名被从对象变更为数据对象,因为对象是一个保留字PHP 7。因此,您可以使用类似:

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

更新2018

该答案旨在以最简洁的方式说明原始问题的答案,而不是在实际代码示例的上下文中。尽管它确实回答了问题,但它\Magento\Framework\DataObject是新的Varien_Object,实现不是100%符合Magento 2最佳实践。正如@MatthiasKleine指出的那样,Magento 2在代码中创建对象的最佳实践是使用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 -标准= MEQP2”:直接对象实例化(\ Magento的\框架\数据对象的对象)在Magento 2.不鼓励
的Jeroen默朗- MageHost

1
@ JeroenVermeulen-MageHost是正确的,但这只是一个警告,以使您意识到潜在的错误。对于DataObject,我认为依赖注入和工厂没有任何好处。毕竟,这只是一个荣耀的数组。
Fabian Schmengler '17

如何在对象中分配多个数组值?@Andrew
Dhaduk Mitesh

最好使用 $obj->setData($item)代替。$obj->setItem($item)这样,您将可以直接获取$objusing方法的任何字段值。像$obj->getName()等等
帕特里克·w ^

13

代替使用“ new”创建对象,您应该使用DI(依赖注入)来注入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 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.