Как создать объект varien в 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?

ND17
источник

Ответы:

32

В Magento 2 Varien_Objectэквивалентом является \Magento\Framework\DataObject.Имя класса, которое было изменено с Object на DataObject, потому что объект является зарезервированным словом в PHP 7. Таким образом, вы можете использовать что-то вроде:

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

Обновление 2018

Этот ответ предназначен для того, чтобы проиллюстрировать ответ на исходный вопрос в максимально сжатой форме, а не в контексте реального примера кода. Хотя это и ответило на вопрос, \Magento\Framework\DataObjectявляется ли это новым Varien_Object, реализация не на 100% соответствовала лучшей практике Magento 2. Как указал @MatthiasKleine, лучшая практика для создания объектов в вашем коде в Magento 2 - это использование DI-среды Magentos для внедрения фабрики в ваш класс через конструктор и использование этой фабрики для создания вашего объекта. Имея это в виду, использование 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.
Йерун Вермёлен - MageHost
1
@ JeroenVermeulen-MageHost верно, но это всего лишь предупреждение , чтобы вы знали о потенциальной ошибке. Для DataObject, я бы сказал, что нет никакой выгоды в инъекции зависимостей и на фабриках. В конце концов, это просто прославленный массив.
Фабиан Шменглер
Как назначить несколько значений массива в объекте? @ Андрей
Дхадук Митеш
Лучше использовать $obj->setData($item)вместо этого. $obj->setItem($item)Таким образом, вы сможете получить любое значение поля при $objиспользовании метода напрямую. Как $obj->getName()и т. Д.
Патрик 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
Большое спасибо -): Это работает как шарм для меня.
Чарви Парих
Как назначить несколько значений массива в объекте? @Matthias
Дхадук Митеш