Como criar objetos varien no magento 2?

16

No magento 1, podemos criar vários objetos como este

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

Como criar objetos no magento 2?

ND17
fonte

Respostas:

32

Em Magento 2 o Varien_Objectequivalente é \Magento\Framework\DataObject.O nome de classe foi mudado de objecto a objecto dataObject porque é uma palavra reservada no PHP 7. Então você pode usar algo como:

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

Atualização 2018

Esta resposta pretendia ilustrar uma resposta da pergunta original da maneira mais sucinta possível e não no contexto de um exemplo de código real. Embora tenha respondido à pergunta, \Magento\Framework\DataObjecté a novidade Varien_Object, a implementação não estava 100% alinhada com as melhores práticas do Magento 2. Como o @MatthiasKleine apontou, a melhor prática do Magento 2 para criar objetos no seu código é usar a estrutura Magentos DI para injetar uma fábrica em sua classe através do construtor e usar essa fábrica para criar seu objeto. Com isso em mente, usar o DI para criar um DataObject em seu próprio código deve ser algo como isto:

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
fonte
11
Isso gera um aviso durante a execução 'phpcs --standard = MEQP2': instanciação objeto direto (objeto da \ Magento \ Framework \ DataObject) é desencorajado em Magento 2.
Jeroen Vermeulen - MageHost
11
@ JeroenVermeulen-MageHost certo, mas é apenas um aviso , para alertá-lo sobre um possível erro. Quanto a isso DataObject, eu argumentaria que não há benefício na injeção de dependência e nas fábricas. Afinal, é apenas uma matriz glorificada.
Fabian Schmengler
Como atribuir vários valores de matriz no objeto? @Andrew
Dhaduk Mitesh
Será melhor usar em $obj->setData($item)vez de $obj->setItem($item)Dessa forma, você poderá obter qualquer valor de campo $objusando o método diretamente. Como $obj->getName()etc.
Patrick W
13

Em vez de criar o objeto com 'novo', você deve usar DI (Injection Dependency Injection) para injetar a classe Factory e usá-lo para criar novas instâncias do 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
fonte
11
Desta forma, é a maneira correta para declarar objeto de dados, quando você segue padrão de codificação como MEQP / MEQP2 / PSR etc ... Obrigado ...
Bhavik
Muito obrigado -): Funciona como charme para mim.
Charvi Parikh
Como atribuir vários valores de matriz no objeto? @Matthias
Dhaduk Mitesh