Magento 1で、コントローラーアクションから「ビュー」にデータを渡す場合(レイアウトのブロックなど)
経由でグローバルレジストリに値/オブジェクトを追加します
Mage::register
実行後にブロックオブジェクトを直接フェッチし、フェッチしたブロックオブジェクトにデータプロパティを設定します
loadLayout
phtml
ファイル内のブロックオブジェクトのメソッドを呼び出し、ブロックオブジェクトにモデル/データベースレイヤーを使用して、コントローラーアクションで以前に保存されたデータを読み取らせる
ブロックオブジェクトメソッドを使用してデータベースから読み取ることは、Magento 2でも引き続き機能するようです。これは、特定の種類の操作に適しています。しかしながら、
Magento 2にはグローバルレジストリがありません(またはありますか?)
レイアウトシステムは、ファクトリを介してページオブジェクトを作成することで機能するようになりました。Magento1と同じ方法でブロック参照を取得することはできません。
Magento 2では、コントローラーアクションからビューに直接データを渡すことはできますか?それとも、これはMagentoの勇敢な新しいDesign Pattern™の世界のパターンでもありますか?これがあまりにも直接的なパターンである場合、テンプレートに表示したい計算された情報があるが、その情報をステートフルシステムに保存したくない場合(つまり、データベース)
私はこれを自分で一緒にハックするいくつかの異なる方法を考えることができますが、Magento 2 がどのようにあなたにそれを望んでいるかに興味があります。
注:このようなものを使用して、コントローラーアクションでブロックインスタンスをフェッチすることが可能であることを認識しています
$resultPage = $this->resultPageFactory->create();
$block = $resultPage->getLayout()->getBlock('catalog.wysiwyg.js');
var_dump(spl_object_hash($block));
Magento 2コアコードはこれを頻繁に行います。しかしながら-ブロックオブジェクトがコントローラオブジェクトにフェッチと思わに利用可能であるとは異なるオブジェクトphtml
のいずれかを介してテンプレート$this
または$block
(前者($this
後(一方、実際にテンプレートを描画オブジェクトであると思われる)$block
)があるように思われますMagento Blockタイプのインスタンス)。
#File: path/to/template.phtml
var_dump(spl_object_hash($block));
var_dump(spl_object_hash($this));
コントローラーアクションメソッドにデータを設定すると、phtml
テンプレートでデータが利用できなくなり、spl_object_hash
上記の結果を比較すると、3つの異なるハッシュが得られるため、「あるように見えます」と言います。しかし、私はこれに十分慣れていないので、上記のエラーは他のエラーになる可能性があります。したがって、ブロックにデータを設定してテンプレートで取得できた場合は、それについて聞いてみたいです!