【问题标题】:Changing how variables are retrieved in a Zend Framework view script更改在 Zend Framework 视图脚本中检索变量的方式
【发布时间】:2026-01-09 05:40:01
【问题描述】:

我正在使用 Zend 框架从控制器将变量传递给视图脚本。我想知道是否可以预先过滤视图,以便更改在视图脚本中检索变量的方式。

例如。在控制器中我有:

$this->view->name = 'Bob';

在我看来:

echo $this->name;

毫无疑问,哪个很好用!我想要的是偶尔有能力改变它,所以我可以使用:

echo $name;

所以基本上,删除 $this 语句。这可能吗?我正在制作一个模板,并让其他设计师使用模板系统,并希望让他们更容易输入 $this->array->name。

我知道在视图脚本中我可以简单地添加:

$name = $this->name;

但我想在控制器的某个地方这样做。

感谢您的建议!

【问题讨论】:

  • 如果您想用您的姓名签署消息,请更改您的用户名,不要在实际帖子中包含一行。 :)

标签: php zend-framework zend-view


【解决方案1】:

我会在前面说,我认为在视图输出变量的范围内胡闹不是一个好主意。通过在全局范围内公开视图的内部结构,这违背了框架的 MVC 模式。但如果你真的坚持这样做,在控制器中,你可能可以像这样全局分配它们:

$GLOBALS['name'] = $this->view->name;

稍后以$name$GLOBALS['name'] 访问它们。

注意:根据视图变量的填充时间和您在控制器中分配它们的时间,您可能需要分配引用。

$GLOBALS['name'] = &$this->view->name;

【讨论】:

  • 可怕!从技术上讲,你写的东西可能是有道理的。在我看来,它似乎可以在实践中发挥作用。但是,在那一点上,我会开始问自己......为什么要打扰使用 MVC 框架,当我完全搞砸了......并创建了一些不太好的意大利面条代码? ;-)
  • @maraspin 我认为这是“足以吊死自己的绳索”的答案之一......希望我对 OP 的免责声明足够清楚。
  • 明白你的意思。 ;-) 我的评论实际上更多地是为了吓唬新手反对“奇怪”的做法,而不是其他任何事情。
  • 嗯,是的,我根本不想使用全局变量。我希望可以在控制器中使用一些预渲染功能将正确的变量传递给视图。如果我需要以任何方式修改核心或结构,那可能不值得。
【解决方案2】:

你的想法是合理的,似乎很容易实现。只需将此行添加到模板的开头即可:

<?php extract(get_object_vars($this)) ?>

通过全局变量将状态传递给视图可能不是一个好主意,但这种方式是安全的,因为 extract 创建的是局部变量,而不是全局变量。

如果您想重用此方法并且不想复制和粘贴,您可以轻松地从 Zend_View 继承,将此行引入方法(如果我没记错的话)_run,然后在您的引导程序中:

  • 创建控制器实例,
  • 获取 ViewRenderer 动作助手(使用 Zend_Controller_Action_HelperBroker 的静态方法)
  • 将视图实例注入 ViewRenderer

这样,您的所有视图都会将其公共属性显示为变量。

【讨论】: