Як створити варіативний об’єкт у магенто 2?


16

У magento 1 ми можемо створити подібний варіант

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

Як створити об’єкт у magento 2?

Відповіді:


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 для створення об'єктів у вашому коді є використання рамки 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-MageHost вірно, але це лише попередження , щоб ви дізналися про потенційну помилку. Щодо того DataObject, я стверджую, що в ін'єкційних залежностях та на заводах немає ніякої користі. Це все-таки прославлений масив.
Фабіан Шменглер

Як призначити декілька значень масиву в об’єкті? @Andrew
Dhaduk Mitesh

Буде краще використовувати $obj->setData($item)замість $obj->setItem($item)цього способу ви зможете отримати будь-яке значення поля, $objвикористовуючи метод безпосередньо. Як і $obj->getName()т.д.
Патрік Ш

13

Замість того щоб створювати об’єкт 'new', слід використовувати 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
Dhaduk Mitesh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.