使用带有默认模块布局的管理模块中的 Zend 视图助手

Posted

技术标签:

【中文标题】使用带有默认模块布局的管理模块中的 Zend 视图助手【英文标题】:Using Zend view helper from admin module with default module layout 【发布时间】:2012-12-28 16:29:22 【问题描述】:

我的布局中调用了一个视图助手,它在默认模块中运行良好,但是当我在另一个模块中时出现异常。

我已经通过设置更改了我的 app.ini 以在所有模块中使用默认布局:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

在这里搜索和谷歌为我提供了另一个 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 文件,即使它应该使用 APPLICATION_PATH 值作为前缀。

我的布局调用如下所示

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

我的 AutoScript.php 文件的类在 application/views/helpers/ 中定义

class Zend_View_Helper_AutoScript extends Zend_View_Helper_Abstract 
  public function AutoScript() ...

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

【问题讨论】:

【参考方案1】:

通常,您会使用自己的前缀命名自定义视图助手,而不是 Zend_ 前缀。除此之外,还有几种选择放置和命名视图助手的位置。

如果这个视图助手真的是一个单一的应用程序助手,那么我发现它自然存在于application 文件夹中的某个位置。在那个可能性空间内,我会询问 view-helper 是在 single 模块中使用还是在 multiple 模块中使用。

如果 view-helper 打算在 single 模块中使用,那么我依赖于内置资源自动加载器映射并将我的 view-helper 类 Mymodule_View_Helper_Myhelper 放在文件 @ 987654324@。

如果 view-helper 旨在跨 多个 模块使用,我可能会将其拉到比 modules 文件夹高一点的位置,例如 Application_View_Helper_Myhelper(假设 appnamespace 的 @ 987654328@) 存储在 application/views/helpers/Myhelper.php。在这种情况下,我们需要告诉视图该目录中有前缀为Application_View_Helper_ 的助手。这可以在引导程序中完成:

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


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

最后,如果要在多个项目中使用此视图助手,则需要将其置于应用程序范围之外,即library 文件夹中。所以也许一个类MyLibrary_View_Helper_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 函数添加到我的引导程序中。我的类名和助手调用之间的大小写差异是由于建议某些(linux)服务器不喜欢类名和助手调用之间的大小写差异。 是的,根据我的经验,大多数 Linux 文件系统似乎都是特定于大小写的。即使没有,ZF 本身也有自己的案例约定,用于查看帮助程序类的名称和您在调用中使用的方法名称。无论如何,很高兴它对你有用。干杯!

以上是关于使用带有默认模块布局的管理模块中的 Zend 视图助手的主要内容,如果未能解决你的问题,请参考以下文章

Zend框架中的登录和注销问题

将内容管理系统添加到现有 Zend Framework 应用程序

Zend可重用的小部件/插件/ miniapplications?

带有 Zend Framework 2 模块的 PHPUnit

如何在 Zend Framework 2 中为局部使用共享视图脚本路径?

Zend 框架 2 - 在布局中添加子视图?