Magento 2: Создание объектов данных с неизменным состоянием?

9

Ласточкин хвост от комментария в другом Magento 2

Если вам нужно поделиться некоторым вычисленным значением, поместите расчетное поведение в отдельный объект и вызовите его из блоков, которым требуется это значение. Реестр не рекомендуется, потому что это глобальное изменчивое состояние, и вы никогда не уверены, что вы получите оттуда.

Есть ли способ создать Объект в Magento 2 с неизменным состоянием? Использование registry ( 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) любой код в любом месте пути выполнения может использовать или изменять этот раздел реестра любым способом. Это может вызвать большие проблемы. Лучше использовать определенный интерфейс и синглтон с внедрением зависимостей, чтобы поддерживать эти данные состояния.
Райан Херр
Объект с сеттерами не является неизменным. Используйте конструктор, чтобы установить данные в объекте.
Канди

Ответы:

4

Нет, в настоящее время нет лучшего способа создания неизменных объектов данных в Magento 2. Вы можете создать его, например, путем генерации геттеров и конструктора из интерфейса.

Канди
источник