在Magento 1中,如果要将数据从Controller动作传递到“视图”(即,布局中的块,则可以)
通过以下方式将值/对象添加到全局注册表中
Mage::register
运行后直接获取块对象并在获取的块对象上设置数据属性
loadLayout
调用
phtml
文件中块对象的方法,并使块对象使用模型/数据库层读取以前保存在控制器动作中的数据
在Magento 2中,仍然可以使用块对象方法从数据库中读取数据,这适用于某些类型的操作。然而,
Magento 2中不再有全局注册表(或存在?)
现在,布局系统可以通过工厂创建页面对象来工作,并且您无法像在Magento 1中一样获取块引用
在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块类型的实例)。
#File: path/to/template.phtml
var_dump(spl_object_hash($block));
var_dump(spl_object_hash($this));
我之所以说“似乎是”,是因为如果我在controller action方法中设置数据,则该数据在phtml
模板中不可用-如果我比较spl_object_hash
上面的结果,则会得到三个不同的哈希值。但是,对于这一切我还是很陌生,因此上面的内容可能是我犯的其他错误-因此,如果您能够在块上设置数据并将其提取到模板中,那么我很想听听!