마 젠토 2 : 불변 상태의 데이터 객체 생성?


9

오프가 연계 다른 젠토 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에서 내가 모르는 불변의 데이터 객체를 만드는 더 좋은 방법이 있습니까?


이전 Mage Registry 패턴이 값을 변경 불가능하게 만들지 않습니까? IMHO 이것은 lang 구문이어야합니다. M2는 HHVM과 호환되므로 필자가이 구성을 절실히 필요로한다면 불변의 데이터 유형을 제공하는 Hack을 채택 할 수 있습니다. 분명히 이것이 실제로는 Thing One Could Do ™ 일 수있는 것처럼 몸짓하는 것처럼 농담과 내 머리가 옆으로 쏠렸다 고합니다.
philwinkle

1
Anton의 의견의 핵심은 레지스트리 인터페이스를 사용하는 경우 실제로 나가는 것에 대한 보장이 없다는 것입니다. '알겠습니다. 레지스트리 키 current_model에 \ My \ Model을 저장하고 필요에 따라 사용하겠습니다.'라고 말할 수 있습니다. 그러나 (1) current_model이 \ My \ Model의 인스턴스임을 보증하는 것은 없습니다. (2) 실행 경로의 다른 곳에서 코드는 어떤 방식 으로든 해당 레지스트리 키를 사용하거나 수정할 수 있습니다. 큰 문제가 발생할 수 있습니다. 의존성 주입과 함께 정의 된 인터페이스와 싱글 톤을 사용하여 해당 상태 데이터를 유지하는 것이 좋습니다.
Ryan Hoerr

세터가있는 객체는 변경할 수 없습니다. 생성자를 사용하여 객체에 데이터를 설정하십시오.
KAndy

답변:


4

아니요, 현재 Magento 2에서 불변 데이터 개체를 만드는 더 좋은 방법은 아닙니다. 예를 들어 인터페이스에서 생성자 및 생성자에 의해 생성 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.