据我了解,像 Twig 这样的模板引擎的主要设计思想是从视图中删除所有 PHP 代码,并让呈现视图的控制器设置该视图中所需的所有参数。
然而,想象一个视图由不同的“块”组成:页眉、页脚、购物车和产品列表。您可以让 order_controller.php 检查客户是否登录(因为如果没有,标题不包含“注销”链接),以及获取所有可用产品的列表(以显示它们在产品块),以及在 $_SESSION 中获取购物车的内容(以在购物车块中显示它们)。
然而,让 order_controller 只获取一件事可能更有趣:产品列表。然后,将由控制器呈现的视图将包含其他块(页眉、页脚和购物车)的不同包含,但它们不会包含它们的视图。它们将包括其他控制器(showheader_controller、showfooter_controller 和 showcart_controller),这些控制器反过来会渲染自己的单个块(showheader_controller 只会渲染标题视图等)。简而言之:您将包括在主视图中呈现视图的控制器。然后检查客户是否登录的逻辑将是 showheader_controller,原因很简单,标题视图是唯一需要知道这一点的视图。
这样,您可以拥有大量显示标题的控制器,但不是让每个控制器重复逻辑来检查客户是否登录,而是只将它放在一个地方(呈现标题视图)。如果有一个 Twig 函数可以在视图中的该位置包含任何外部源,那么问题将得到解决(因为我可以只包含其他控制器),但它只允许包含其他模板(不能在其中包含 PHP 逻辑,否则会有点失败)。
我现在解决这个问题的方法是让 order_controller 有这个逻辑:
- 获取产品列表
- 启动输出流的缓冲 (ob_start())
- 包括呈现标题的控制器 (showheader_controller)
- 将缓冲区的内容存储在变量 $headerView 中。
- 清理缓冲区
- 启动输出流的缓冲 (ob_start())
- 包括呈现购物车的控制器 (showcart_controller)
- 将缓冲区的内容存储在变量 $cartView 中。
- 清理缓冲区
- 冲洗并重复...
在视图中,我打印设置变量的内容:
{{ headerView | raw }}
必须添加原始过滤器,因为 headerView 变量包含 html-tags。
它工作得很好,但并不完全“整洁”。
我的问题:是否有更好的方法来实现这一战略?