Magento 2: Creazione di oggetti dati con stato immutabile?


9

A coda di rondine un commento in un altro Magento 2

Se è necessario condividere un valore calcolato, inserire il comportamento del calcolo per separare l'oggetto e chiamarlo dai blocchi che richiedono quel valore. Il registro è scoraggiato perché è uno stato mutabile globale e non si è mai sicuri di ciò che si otterrà da lì.

C'è un modo per creare un oggetto in Magento 2 con stato immutabile? L'uso del registro ( Magento\Framework\Registry) è sconsigliato perché è uno stato mutabile globale (presumibile perché, sebbene il registermetodo non ti permetta di cambiare una chiave esistente, puoi disinserire e quindi resettare quella chiave).

Tuttavia, lo stesso problema esiste per qualsiasi oggetto in Magento 2. Se dovessi creare un oggetto

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

class ViewVars extends DataObject
{
}

Quindi l'iniezione automatica della dipendenza del costruttore garantisce che chiunque possa afferrare quell'oggetto condiviso. Se l'oggetto non è condiviso, la vista / blocco non può afferrarlo.

In teoria, potremmo fare qualcosa del genere

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

Ma sembra un sacco di lavoro per un'attività tanto comune quanto l'impostazione di singole variabili per una vista . Esiste un modo migliore in Magento 2 per creare oggetti dati immutabili di cui non sono a conoscenza?


Il vecchio schema del registro dei maghi non tenta di rendere immutabile il valore? IMHO questo dovrebbe essere un costrutto lang. M2 è compatibile con HHVM, quindi se hai disperatamente bisogno di questo costrutto potresti adottare Hack, che fornisce tipi di dati immutabili. Ovviamente questo è detto sia per scherzo che con la mia testa inclinata di lato come se volesse dire che potrebbe essere un Thing One Could Do ™.
Filwinkle,

1
Penso che il punto del commento di Anton sia stato più che se stai usando un'interfaccia di registro, non ci sono garanzie su ciò che stai effettivamente ottenendo. Puoi dire: "okay, vado a memorizzare \ My \ Model nella chiave di registro attuale_model qui, e lo userò come necessario". Ma (1) nulla garantisce che current_model sia un'istanza di \ My \ Model (o qualsiasi altra cosa); e (2) qualsiasi codice in qualsiasi altra parte del percorso di esecuzione potrebbe utilizzare o modificare tale chiave di registro in alcun modo. Ciò potrebbe causare grossi problemi. Meglio usare un'interfaccia definita e singleton con iniezione di dipendenza per mantenere i dati di stato.
Ryan Hoerr,

L'oggetto con setter non è immutabile. Utilizzare la funzione di costruzione per impostare i dati nell'oggetto.
KAndy,

Risposte:


4

No, attualmente non è il modo migliore in Magento 2 di creare oggetti dati immutabili. È possibile crearlo, ad esempio generando getter e costruttore dall'interfaccia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.