Comment créer un objet varien dans magento 2?

16

Dans magento 1, nous pouvons créer un objet varien comme celui-ci

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

Comment créer un objet dans magento 2?

ND17
la source

Réponses:

32

Dans Magento 2, l' Varien_Objectéquivalent est \Magento\Framework\DataObject.Le nom de la classe a été changé d'Object en DataObject car object est un mot réservé dans PHP 7. Vous pouvez donc utiliser quelque chose comme:

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

Mise à jour 2018

Cette réponse avait pour but d'illustrer une réponse à la question d'origine de la manière la plus succincte possible et non dans le cadre d'un exemple de code réel. Bien qu'elle ait répondu à la question, \Magento\Framework\DataObjectest la nouvelle Varien_Object, la mise en œuvre n'était pas à 100% conforme aux meilleures pratiques de Magento 2. Comme l'a souligné @MatthiasKleine, la meilleure pratique de Magento 2 pour créer des objets dans votre code est d'utiliser le framework Magentos DI pour injecter une fabrique dans votre classe via le constructeur et utiliser cette fabrique pour créer votre objet. Dans cet esprit, l'utilisation de DI pour créer un DataObject dans votre propre code devrait ressembler à ceci:

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
la source
1
Cela lance un avertissement lors de l'exécution de 'phpcs --standard = MEQP2': L'instanciation d'objet directe (objet de \ Magento \ Framework \ DataObject) est déconseillée dans Magento 2.
Jeroen Vermeulen - MageHost
1
@ JeroenVermeulen-MageHost à droite, mais ce n'est qu'un avertissement , pour vous signaler une erreur potentielle . Pour le DataObject, je dirais qu'il n'y a aucun avantage à l'injection de dépendance et aux usines. C'est juste un tableau glorifié après tout.
Fabian Schmengler
Comment attribuer plusieurs valeurs de tableau dans l'objet? @Andrew
Dhaduk Mitesh
Il sera préférable d'utiliser $obj->setData($item)au lieu de De $obj->setItem($item)cette façon, vous pourrez obtenir n'importe quelle valeur de champ en $objutilisant directement la méthode. Comme $obj->getName()etc.
Patrick W
13

Au lieu de créer l'objet avec 'new', vous devez utiliser DI (Dependency Injection) pour injecter la classe Factory et utiliser cette fabrique pour créer de nouvelles instances 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
la source
1
Cette façon est correcte pour déclarer un objet de données, lorsque vous suivez la norme de codage comme MEQP / MEQP2 / PSR etc ... Merci ...
Bhavik
Merci beaucoup -): Cela fonctionne comme un charme pour moi.
Charvi Parikh
Comment attribuer plusieurs valeurs de tableau dans l'objet? @Matthias
Dhaduk Mitesh