Magento 2: Створення об'єктів даних з незмінним станом?


9

Довершення коментаря в іншому Magento 2

Якщо вам потрібно поділити якесь обчислене значення, покладіть обчислювальну поведінку на окремий об'єкт і викликайте його з блоків, які потребують цього значення. Реєстр не відсторонений, тому що це глобальний стан, що змінюється, і ви ніколи не знаєте, що звідти отримаєте.

Чи є спосіб створити Об'єкт у Magento 2 з незмінним станом? Використання реєстру ( Magento\Framework\Registry) не рекомендується через те, що він є глобальним станом , що registerзмінюється (імовірно, оскільки, хоча метод не дозволяє вам змінити існуючий ключ, ви можете вимкнути та повторно скинути цей ключ).

Однак - така ж проблема існує для будь-якого об’єкта в Magento 2. Якби я створив об’єкт

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

class ViewVars extends DataObject
{
}

Тоді автоматичне введення залежності конструктора гарантує, що хтось може схопити цей спільний об'єкт Якщо об'єкт не є спільним, то перегляд / блок не може захопити його.

Теоретично ми могли б зробити щось на кшталт

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

Але це здається великою роботою для завдання, настільки поширеного, як встановлення окремих змінних для представлення . Чи є кращий спосіб у Magento 2 створити незмінні об’єкти даних, про які я не знаю?


Чи не стара модель шаблону реєстру намагається зробити значення незмінним? ІМХО, це має бути мовна конструкція. M2 сумісний з HHVM, тому якщо вам відчайдушно потрібна ця конструкція, ви можете прийняти Hack, який надає незмінні типи даних. Очевидно, це сказано як жартома, так і моєю головою нахиленою в бік, ніби жестикулюючи, що це насправді може бути щось, що може бути ™.
philwinkle

1
Я думаю, що питання коментаря Антона було більше в тому, що якщо ви використовуєте інтерфейс реєстру, немає гарантії того, що ви насправді отримуєте. Ви можете сказати: "добре, я збираюсь зберігати \ My \ Model у ключі реєстру current_model тут і використовувати це за потребою". Але (1) нічого не гарантує, що current_model є екземпляром \ My \ Model (або взагалі нічого); та (2) будь-який код у будь-якому іншому місці на шляху виконання може використовувати або змінювати цей ключ реєстру будь-яким способом. Це може спричинити великі проблеми. Краще використовувати визначений інтерфейс та синглтон з ін'єкцією залежності для підтримки цих даних про стан.
Ryan Hoerr

Об'єкт із сеттерами не змінюється. Використовуйте конструктор для встановлення даних в об'єкт.
Кенді

Відповіді:


4

Ні, на даний момент в Magento 2 немає кращого способу створення незмінних об'єктів даних. Ви можете створити його, наприклад, за допомогою покоління гетерів та конструктора з інтерфейсу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.