Zend framework 使用带有默认模块布局的管理模块中的Zend view helper

Zend framework 使用带有默认模块布局的管理模块中的Zend view helper,zend-framework,layout,module,view-helpers,Zend Framework,Layout,Module,View Helpers,我在布局中调用了一个视图帮助器,它在默认模块中运行良好,但在另一个模块中出现异常 我已通过设置以下内容将我的app.ini更改为在所有模块中使用默认布局: resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" 在此处搜索和google为我提供了另一个app.ini设置,用于为所有模块添加查看帮助程序路径: resources.view.helperPath.Zend_View_Helper = APPLICATIO

我在布局中调用了一个视图帮助器,它在默认模块中运行良好,但在另一个模块中出现异常

我已通过设置以下内容将我的app.ini更改为在所有模块中使用默认布局:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
在此处搜索和google为我提供了另一个app.ini设置,用于为所有模块添加查看帮助程序路径:

resources.view.helperPath.Zend_View_Helper = APPLICATION_PATH "/views/helpers"
但是,该附加设置并没有解决问题,而是导致Zend异常成为WSOD

如果没有第二个app.ini设置,我会看到布局并出现以下异常:

Plugin by name 'AutoScript' was not found in the registry; used paths: Admin_View_Helper_: /Applications/XAMPP/xamppfiles/htdocs/dad/application/modules/admin/views/helpers/ Zend_View_Helper_: Zend/View/Helper/:./views/helpers/
通过helperPath.Zend_View_Helper ini设置,我得到一个具有以下内容的WSOD:

Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'AutoScript' was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/:./views/helpers/' 
插件加载程序似乎正在public/views/helpers/中查找AutoScript.php文件,尽管它应该使用应用程序路径值作为前缀

我的布局调用如下所示

<?php $this->AutoScript(); ?>

我目前的修复方法是将AutoScript.php文件从application/views/helpers复制到modules/admin/views/helpers中,这样可以修复问题,但会复制一个文件。我错过了什么?我是否必须通过在我的引导程序中创建一个_initView函数,以编程方式添加此视图帮助程序路径?

通常,您会使用自己的前缀来命名自定义视图帮助程序,而不是使用
Zend
前缀。除此之外,对于视图助手的放置位置和名称,还有多种选择

如果这个视图帮助器实际上是一个应用程序帮助器,那么我发现它自然会驻留在
应用程序
文件夹中的某个位置。在这个可能性范围内,我会问视图助手是在单个模块中使用还是跨多个模块使用

如果视图帮助器打算在单个模块中使用,那么我依赖于内置的资源自动加载映射,并将我的视图帮助器类
Mymodule\u view\u helper\u Myhelper
放在文件
application/modules/Mymodule/views/helpers/Myhelper.php

如果视图帮助器要跨多个模块使用,我可能会将其拉高到比存储在中的
模块
文件夹稍高一点,比如
应用程序
(假设
应用程序
appnamespace
application/views/helpers/Myhelper.php
。在这种情况下,我们需要告诉视图,在该目录中有前缀为
Application\u view\u Helper\u
的帮助程序。这可以在引导过程中完成:

protected function _initViewHelperPaths()
{
    $this->bootstrap('view');
    $view = $this->getResource('view');
    $view->addHelperPath(APPLICATION_PATH . '/views/helpers', 'Application_View_Helper_');
}
有时,您需要一个存在于另一个模块中的模块中的视图辅助对象,而实际上,您无法移动原始的视图辅助对象。在这种情况下,一种解决方法是在消费模块中定义视图辅助对象的空壳,扩展不可移动的视图辅助对象。在文件
application/mymodule/views/helpers/MyHelper.php
中:

class Mymodule_View_Helper_Myhelper extends Othermodule_View_Helper_Myhelper
{
}
这样,助手实现的代码就不会重复。特定于模块的资源自动加载映射将允许在从视图脚本作为视图帮助程序调用这些类时找到它们

最后,如果要在多个项目中使用此视图辅助对象,则有一个参数用于将其放置在应用程序范围之外的
文件夹中。因此,可能有一个类
MyLibrary\u View\u Helper\u Myhelper
存储在文件
library/MyLibrary/View/Helper/Myhelper.php
中。如前所述,您可能需要在引导或前端控制器插件中通知视图前缀/路径映射:

$view->addHelperPath(APPLICATON_PATH . '/../library/MyLibrary/View/Helper', 'MyLibrary_View_Helper_');
请注意,在上述所有情况下,视图助手功能本身的调用(例如,在视图脚本中)是:

<?php echo $this->myhelper($params) ?>


请特别注意,类名和调用之间的大小写差异。

谢谢,我在研究Zend文档以获得跨模块的视图帮助时,浏览了这些场景。在我的例子中,它是一个跨模块、特定于应用程序的视图助手,我需要使用它。我不知道为什么,但我的问题解决了,而不必将initViewHelperPaths函数添加到我的引导程序中。我的类名和helper调用之间的大小写差异是由于一个建议,即某些(linux)服务器不喜欢类名和helper调用之间的大小写差异。是的,根据我的经验,大多数linux文件系统似乎都是特定于大小写的。即使没有这种情况,ZF本身对视图帮助器类的名称和调用中使用的方法名称也有自己的大小写约定。不管怎样,很高兴你成功了。干杯
<?php echo $this->myhelper($params) ?>