在 Magento 1 中,如果您想将数据从控制器操作传递到“视图”(即布局中的一个块,您可以)

  1. 通过以下方式将值/对象添加到全局注册表 Mage::register

  2. 直接获取一个块对象,运行后对获取到的块对象设置数据属性 loadLayout

  3. 调用块对象的方法 phtml 文件,并让块对象使用模型/数据库层读取先前保存在控制器操作中的数据

使用块对象方法从数据库读取似乎在 Magento 2 中仍然有效——这适用于某些类型的操作。然而,

  1. Magento 2 中不再有全局注册表(或者存在吗?)

  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 核心代码经常这样做。然而——在控制器对象中获取的块对象 似乎是 与 a 中可用的对象不同的对象 phtml 模板通过任一 $this 或者 $block (前者 ($this) 似乎是实际渲染模板的对象,而后面的 ($block)似乎是 Magento 块类型的一个实例)。

#File: path/to/template.phtml
var_dump(spl_object_hash($block));
var_dump(spl_object_hash($this));

我说“似乎是”,因为如果我在控制器操作方法中设置数据,则它在 phtml 模板——如果我比较 spl_object_hash 上面的结果,我得到了三个不同的哈希值。然而,我对这一切还很陌生,上面的内容可能是我犯的一些其他错误——所以如果你能够在块上设置数据并在模板中获取它,我很想听听它!

有帮助吗?

解决方案

关于#1,注册表仍然存在,与您从 Magento 1 中了解到的非常相似。它刚刚搬家。看: \Magento\Framework\Registry

通过依赖注入将其添加到您的构造函数中,然后您就可以使用您熟悉的 $registry->register($key, $value)$registry->registry($key) 存储/访问数据的方法。

如果您还没有的话,我建议您浏览一下 \Magento\Framework 命名空间。以前可以从法师或应用程序访问的很多内容仍然存在,只是分开了。

就最佳实践而言,我无法回答这个问题,但我希望答案是尽可能多地保留控制器的逻辑。查看核心可能是您最好的选择。例如,查看客户地址编辑页面: 基本控制器; 广泛的块-- 如有必要,包括提取地址 ID 和加载。他们直接在区块中处理这个问题;他们不会在控制器中执行此操作然后将其传递。

其他提示

你应该 不是 将变量从控制器操作传递到视图。使用 block to 将变量传递给视图(模板引擎)。

许可以下: CC-BY-SA归因
scroll top