Php 将视图资源添加到应用程序ini后布局参数丢失

Php 将视图资源添加到应用程序ini后布局参数丢失,php,zend-framework,bootstrapping,Php,Zend Framework,Bootstrapping,我想在现有项目中添加视图辅助对象路径。为此,我在application.ini中添加了以下行: resources.view[] = resources.view.helperPath.MyPrefix = "/path/to/helpers" 在我的引导文件中: $this->bootstrap("view"); $view = $this->getResource("view"); $view->addHelperPath(APPLICATION_PATH . "/..

我想在现有项目中添加视图辅助对象路径。为此,我在application.ini中添加了以下行:

resources.view[] =
resources.view.helperPath.MyPrefix = "/path/to/helpers"
在我的引导文件中:

$this->bootstrap("view");
$view = $this->getResource("view");
$view->addHelperPath(APPLICATION_PATH . "/../library/MyPath", MyNamespace");
现在,我确实能够将视图助手添加到我的路径中,因此没有问题

但是,我在动作助手中添加到视图中的变量突然在视图中不再可访问。我可以像往常一样在我的布局中检索它们,这样我就知道它们得到了正确的分配

我在postDispatch中的Action Helper中分配了一个变量:

$view = $this->getActionController()->view;
$view->myVar = $this->var;
然后在我的布局中

Zend_Debug::dump( $this->myVar );
结果为:(字符串)“myVar内容”

在我看来

Zend_Debug::dump( $this->myVar );
结果:空


由于这是一个现有项目,我需要一个通用解决方案,可以在引导或应用程序中使用。ini

您可以从application.ini向视图添加路径:

resources.view[] =
resources.view.helperPath.MyPrefix = "/path/to/helpers"

希望这能解决问题。我假设按照您的方式,现有视图实例会被覆盖,从而破坏以前的更改。您可以尝试从frontcontroller获取视图,设置辅助路径,然后将其传递回frontcontroller

经过一些研究,我发现了这一点

编辑:删除了有关视图变量和布局变量之间差异的文本-参见@pieter和@david weinraub的评论

动作辅助对象的后分派在渲染视图之后但在渲染布局之前激发。因此,在动作助手的postDispatch中分配给视图的任何变量在我的视图中都不可用,它们还不存在


我很好奇为什么这种行为只有在主动引导视图时才会发生?我将不回答这个问题,也许有人可以澄清这一点。

我尝试过这个选项,不幸的是,它产生了相同的结果。在我看来,创建了两个独立的视图实例,一个用于布局,一个用于视图。尽管如此,我的视图变量仍然可以在布局中访问。这当然不是真的。可以从任意位置为视图指定值(只要您有权访问视图对象)。Zend_视图没有歧视;)问题是,;为什么应用程序有一个单独的Zend_视图实例用于Zend_布局和ViewRenderer。这通常是同一个对象(默认情况下,Zend_Layout实际上从ViewRenderer检索视图对象)。如果将视图实例分配给Zend_Layout anywhere,您可能需要检查应用程序。@Pieter找到了。听起来好像有两个视图实例在浮动。在典型流中,分配给
ViewRenderer
(控制器知道的实例)的实例与您引导的实例相同,并且您将这些视图辅助路径分配给了该实例。这听起来好像与正常的流程有一些脱节。在我不得不强制它的情况下,我只是手动将我的视图实例阻塞到ViewRenderer中。因此,在引导过程中,在添加视图辅助路径后,添加:
Zend\u Controller\u Action\u HelperBroker::getStaticHelper('viewerrenderer')->setView($view)我发现发生了什么,没有单独的实例。我会相应地更新我的答案。也许它就像
return$view在引导程序中。可能不会,但值得一试。