¿Cómo crear un objeto varien en magento 2?

16

En magento 1 podemos crear objetos varien como este

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

¿Cómo crear un objeto en magento 2?

ND17
fuente

Respuestas:

32

En Magento 2, el Varien_Objectequivalente es \Magento\Framework\DataObject.El nombre de la clase se cambió de Object a DataObject porque object es una palabra reservada en PHP 7. Entonces podrías usar algo como:

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

Actualización 2018

Esta respuesta pretendía ilustrar una respuesta a la pregunta original de la manera más sucinta posible y no en el contexto de un ejemplo de código real. Aunque sí respondió la pregunta, \Magento\Framework\DataObjectes la nueva Varien_Object, la implementación no fue 100% en línea con las mejores prácticas de Magento 2. Como señaló @MatthiasKleine, la mejor práctica de Magento 2 para crear objetos en su código es usar el marco Magentos DI para inyectar una fábrica en su clase a través del constructor y usar esa fábrica para crear su objeto. Con eso en mente, usar DI para crear un DataObject en su propio código debería verse así:

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);
    }
}
Andrew Kett
fuente
1
Esto arroja una advertencia cuando se ejecuta 'phpcs --standard = MEQP2': la creación de instancias de objetos directos (objeto de \ Magento \ Framework \ DataObject) no se recomienda en Magento 2.
Jeroen Vermeulen - MageHost
1
@ JeroenVermeulen-MageHost tiene razón, pero es solo una advertencia , para hacerle saber de un posible error. Para el DataObject, diría que no hay beneficio en la inyección de dependencia y las fábricas. Es solo una variedad glorificada después de todo.
Fabian Schmengler
¿Cómo asignar un valor de matriz múltiple en el objeto? @Andrew
Dhaduk Mitesh
Será mejor usarlo en $obj->setData($item)lugar de De $obj->setItem($item)esta manera, podrá obtener cualquier valor de campo de $objusar el método directamente. Me gusta, $obj->getName()etc.
Patrick W
13

En lugar de crear el objeto con 'nuevo', debe usar DI (Inyección de dependencia) para inyectar la clase Factory y usar esa fábrica para crear nuevas instancias de 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();
}
Matthias Kleine
fuente
1
De esta manera se forma correcta para la declaración de objeto de datos, cuando se siguen estándar de codificación como MEQP / MEQP2 / PSR etc ... Gracias ...
Bhavik
Muchas gracias -): Funciona de maravilla para mí.
Charvi Parikh
¿Cómo asignar un valor de matriz múltiple en el objeto? @Matthias
Dhaduk Mitesh