Magento 2: Créer des objets de données avec un état immuable?

9

Faire concorder un commentaire dans un autre Magento 2

Si vous devez partager une valeur calculée, définissez le comportement de calcul sur un objet séparé et appelez-le à partir de blocs qui nécessitent cette valeur. Le registre est déconseillé car il s'agit d'un état mutable global et vous n'êtes jamais sûr de ce que vous obtiendrez à partir de là.

Existe-t-il un moyen de créer un objet dans Magento 2 avec un état immuable? L'utilisation du registre ( Magento\Framework\Registry) est déconseillée car il s'agit d'un état mutable global (vraisemblablement parce que, bien que la registerméthode ne vous permette pas de modifier une clé existante, vous pouvez la désactiver puis la réinitialiser).

Cependant - le même problème existe pour tout objet dans Magento 2. Si je devais créer un objet

namespace Pulsestorm\Helloworld\Model;
use Magento\Framework\DataObject;

class ViewVars extends DataObject
{
}

Ensuite, l'injection automatique de dépendances du constructeur garantit que n'importe qui peut saisir cet objet partagé. Si l'objet n'est pas partagé, la vue / le bloc ne peut pas le saisir.

En théorie, nous pourrions faire quelque chose comme

namespace Pulsestorm\Helloworld\Model;

class ViewVars
{
    protected $_data=false;
    protected function setData($data)
    {
        if($_data)
        {
            throw new Exception("Immutable");
        }
        $this->_data = $data;
    }

    public function getData()
    {
        return $this->_data;
    }
}

Mais cela semble être beaucoup de travail pour une tâche aussi courante que la définition de variables individuelles pour une vue . Existe-t-il un meilleur moyen dans Magento 2 de créer des objets de données immuables que je ne connais pas?

Alan Storm
la source
L'ancien modèle de registre Mage n'essaye-t-il pas de rendre la valeur immuable? À mon humble avis, cela devrait être une construction lang. M2 est compatible avec HHVM, donc si vous avez désespérément besoin de cette construction, vous pouvez adopter Hack, qui fournit des types de données immuables. Évidemment, cela est dit à la fois par plaisanterie et avec ma tête penchée sur le côté comme pour faire signe que cela pourrait en fait être une chose que l'on pourrait faire ™.
philwinkle
1
Je pense que le point du commentaire d'Anton était plus que si vous utilisez une interface de registre, il n'y a aucune garantie sur ce que vous sortez réellement. Vous pouvez dire: «D'accord, je vais stocker ici \ My \ Model dans la clé de registre current_model et l'utiliser au besoin». Mais (1) rien ne garantit que current_model est une instance de \ My \ Model (ou quoi que ce soit du tout); et (2) n'importe quel code n'importe où ailleurs dans le chemin d'exécution pourrait utiliser ou modifier cette clé de registre de quelque manière que ce soit. Cela pourrait causer de gros problèmes. Mieux vaut utiliser une interface définie et singleton avec injection de dépendances pour conserver ces données d'état.
Ryan Hoerr
L'objet avec les setters n'est pas immuable. Utilisez le constructeur pour définir les données dans l'objet.
KAndy

Réponses:

4

Non, il n'y a actuellement pas de meilleur moyen dans Magento 2 pour créer des objets de données immuables. Vous pouvez le créer, par exemple par génération de getters et constructeur à partir de l'interface.

KAndy
la source