別の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で、知らない不変のデータオブジェクトを作成するより良い方法はありますか?
古いMage Registryパターンは値を不変にしようとしないのですか?私見これはlangコンストラクトでなければなりません。M2はHHVMと互換性があるため、この構造が必要な場合は、不変のデータ型を提供するHackを採用できます。明らかに、これは冗談でも頭で横に傾けられても、これは実際にはThing One Could Do™の可能性があることをジェスチャーするように言われます。
—
philwinkle
アントンのコメントの要点は、レジストリインターフェイスを使用している場合、実際に何が得られるかについての保証はないということです。「OK、ここで\ My \ Modelをレジストリキーcurrent_modelに保存し、必要に応じて使用します」と言うことができます。しかし、(1)current_modelが\ My \ Model(または何でも)のインスタンスであることを保証するものは何もありません。(2)実行パスの他の場所にあるコードは、そのレジストリキーを何らかの方法で使用または変更できます。それは大きな問題を引き起こす可能性があります。その状態データを維持するために、定義されたインターフェイスと依存関係注入を伴うシングルトンを使用する方が良いでしょう。
—
Ryan Hoerr
セッターを持つオブジェクトは不変ではありません。コンストラクターを使用してオブジェクトにデータを設定します。
—
KAndy