Magento 2: Tworzenie obiektów danych w stanie niezmiennym?

9

Szczegółowy komentarz w innym Magento 2

Jeśli chcesz udostępnić część obliczonej wartości, umieść zachowanie obliczeniowe w oddzielnym obiekcie i wywołaj go z bloków, które wymagają tej wartości. Rejestr jest odradzany, ponieważ jest to globalny stan zmienny i nigdy nie masz pewności, co otrzymasz.

Czy istnieje sposób na stworzenie obiektu w Magento 2 z niezmiennym stanem? Korzystanie z rejestru ( Magento\Framework\Registry) jest odradzane, ponieważ jest to globalny stan zmienny (przypuszczalnie, ponieważ chociaż registermetoda nie pozwala zmienić istniejącego klucza, można go rozbroić, a następnie zresetować).

Jednak - ten sam problem istnieje dla dowolnego obiektu w Magento 2. Gdybym miał utworzyć obiekt

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

class ViewVars extends DataObject
{
}

Następnie automatyczne wstrzykiwanie zależności od konstruktora zapewnia, że ​​każdy może pobrać ten udostępniony obiekt. Jeśli obiekt nie jest udostępniony, widok / blok nie może go pobrać.

Teoretycznie moglibyśmy zrobić coś takiego

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

Ale to wydaje się dużo pracy dla zadania tak powszechnego, jak ustawianie poszczególnych zmiennych dla widoku . Czy istnieje lepszy sposób na tworzenie niezmiennych obiektów danych w Magento 2, o których nie wiem?

Alan Storm
źródło
Czy stary wzorzec Rejestru Magów nie próbuje uczynić tej wartości niezmienną? IMHO powinien to być konstrukt językowy. M2 jest kompatybilny z HHVM, więc jeśli desperacko potrzebujesz tej konstrukcji, możesz zastosować Hack, który zapewnia niezmienne typy danych. Oczywiście jest to powiedziane zarówno żartem, jak i głową pochyloną na bok, jakby chciałem zasygnalizować, że to może być Thing One Could Do ™.
philwinkle,
1
Myślę, że sens komentarza Antona był bardziej związany z tym, że jeśli używasz interfejsu rejestru, nie ma żadnej gwarancji tego, co naprawdę wydostajesz się. Możesz powiedzieć: „Okej, mam zamiar zapisać \ Mój \ Model w kluczu rejestru current_model tutaj i użyć go w razie potrzeby”. Ale (1) nic nie gwarantuje, że current_model jest instancją \ My \ Model (lub cokolwiek w ogóle); oraz (2) dowolny kod w dowolnym miejscu na ścieżce wykonania może wykorzystywać lub modyfikować ten klucz rejestru w jakikolwiek sposób. To może powodować duże problemy. Lepiej używać zdefiniowanego interfejsu i singletonu z iniekcją zależności, aby zachować dane stanu.
Ryan Hoerr
Obiekt z seterami nie jest niezmienny. Użyj konstruktora, aby ustawić dane w obiekcie.
KAndy,

Odpowiedzi:

4

Nie, obecnie nie ma lepszego sposobu na tworzenie niezmiennych obiektów danych w Magento 2. Możesz go utworzyć, na przykład przez generowanie pobierających i konstruktorów z interfejsu.

KAndy
źródło