Magento 2: Erstellen von Datenobjekten mit unveränderlichem Status?

9

Verzahnen off einen Kommentar in einem anderen Magento 2

Wenn Sie einen berechneten Wert freigeben müssen, setzen Sie das Berechnungsverhalten, um das Objekt zu trennen, und rufen Sie es von Blöcken auf, die diesen Wert benötigen. Die Registrierung wird nicht empfohlen, da es sich um einen global veränderlichen Status handelt und Sie nie sicher sind, was Sie von dort erhalten.

Gibt es eine Möglichkeit, ein Objekt in Magento 2 mit unveränderlichem Status zu erstellen? Von der Verwendung von registry ( Magento\Framework\Registry) wird abgeraten, da es sich um einen global veränderlichen Status handelt (vermutlich, weil Sie mit dieser registerMethode zwar keinen vorhandenen Schlüssel ändern können , diesen Schlüssel jedoch deaktivieren und dann zurücksetzen können).

Das gleiche Problem besteht jedoch für jedes Objekt in Magento 2. Wenn ich ein Objekt erstellen würde

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

class ViewVars extends DataObject
{
}

Die automatische Injektion der Konstruktorabhängigkeit stellt dann sicher, dass jeder das gemeinsam genutzte Objekt greifen kann. Wenn das Objekt nicht freigegeben ist, kann die Ansicht / der Block es nicht erfassen.

Theoretisch könnten wir so etwas tun

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;
    }
}

Dies scheint jedoch eine Menge Arbeit für eine Aufgabe zu sein, die so häufig ist wie das Festlegen einzelner Variablen für eine Ansicht . Gibt es in Magento 2 eine bessere Möglichkeit, unveränderliche Datenobjekte zu erstellen, die mir nicht bekannt sind?

Alan Storm
quelle
Versucht das alte Mage Registry-Muster nicht, den Wert unveränderlich zu machen? IMHO sollte dies ein langes Konstrukt sein. M2 ist mit HHVM kompatibel. Wenn Sie dieses Konstrukt dringend benötigen, können Sie Hack verwenden, das unveränderliche Datentypen bereitstellt. Offensichtlich wird dies sowohl im Scherz als auch mit zur Seite geneigtem Kopf gesagt, als ob ich gestikulieren möchte, dass dies tatsächlich eine Sache sein könnte, die man tun könnte.
Philwinkle
1
Ich denke, der Sinn von Antons Kommentar war eher, dass es bei Verwendung einer Registrierungsschnittstelle keine Garantie dafür gibt, was Sie tatsächlich herausbringen. Sie können sagen: "Okay, ich werde \ My \ Model hier im Registrierungsschlüssel current_model speichern und bei Bedarf verwenden." Aber (1) nichts garantiert, dass current_model eine Instanz von \ My \ Model ist (oder überhaupt etwas); und (2) jeder Code irgendwo anders im Ausführungspfad könnte diesen Registrierungsschlüssel auf irgendeine Weise verwenden oder ändern. Das könnte große Probleme verursachen. Verwenden Sie besser eine definierte Schnittstelle und einen Singleton mit Abhängigkeitsinjektion, um diese Statusdaten zu verwalten.
Ryan Hoerr
Objekt mit Setzern ist nicht unveränderlich. Verwenden Sie den Konstruktor, um Daten im Objekt festzulegen.
KAndy

Antworten:

4

Nein, derzeit ist es in Magento 2 nicht besser, unveränderliche Datenobjekte zu erstellen. Sie können es beispielsweise erstellen, indem Sie Getter und Konstruktoren aus der Schnittstelle generieren.

KAndy
quelle