拉视图是从控制器中提取数据的视图(它反过来调用模型来查找数据)。
如果您严格遵守 MVC 模式[1],那么您将不会使用任何类型的拉取视图。
但是AFAIK没有[2]的模板引擎repspect MVC,因为它们允许模板中的逻辑(if / foreach /函数调用等)。
没有模板引擎会预先编写代码来假设存在任何数据,但几乎所有模板引擎都允许您传递一个巨大的数据数组,其中包含您在页面上需要的所有内容。
如果您需要一个将数据预填充到变量中的模板引擎,那不是模板引擎,而是一个完整的应用程序,它包含与数据库或模型通信的逻辑,这使其远离模板引擎的概念。
[1] 当我们谈论模板引擎时,尊重 MVC 意味着只使用if来检查是否设置了变量,不应该存在 for/foreach 循环,通过将模板应用于集合对象来完成项目集/列表的范围,这里说明了这一点和其他问题:http: //bit.ly/Jc3f0Z
[2] 除外: Java、C# 和 Python 中的StringTemplate;包括 JS/Node.js/Java/PHP/Python/Ruby 在内的许多语言中的Mustache。
编辑
使用视图类来准备数据,并使用模板文件来输出它们对我来说总是像一个杂物一样缝合起来,因为名称变得混乱(视图是类+模板,模板是文件)。
That's why I name my preprocessing classes "Renderers" and my template files "Templates" so Renderers+Templates = Views. Which makes more sense to me as a name and as a philosophy.
I can use money_format/number_format/html_escape etc. within the renderers and then output already rendered data into the templates. Therefore I don't mix rendering/viewing actions with the controller. They all get done in the Renderer.