【问题标题】:Zend Framework Autoloader questionZend Framework 自动加载器问题
【发布时间】:2011-02-26 14:45:05
【问题描述】:

在 zend 框架中,我像这样注册我的命名空间(在 application.php 中):

'autoloaderNamespaces' => array(
    'Cms_'
)

在此之后 - 如果调用了未知类,我希望 Zend 总是会检查除了 Zend 和 ZendX 路径之外的路径。但由于某种原因,这不适用于例如视图助手。

我仍然需要为我的视图助手注册一个单独的路径,即使视图助手脚本是根据 Zend 编码标准命名的并且位于:

Cms/View/Helper/

这就是我在配置文件中注册辅助路径的方式:

view' => array(
    'charset' => 'UTF-8',
    'doctype' => 'XHTML1_TRANSITIONAL',
    'helperPath' => array(
        'Cms_View_Helper_' => 'Cms/View/Helper'
        )
),

所以 - 我不知道为什么我必须先通过“autoloaderNamespaces”注册两次“Cms”命名空间,然后再通过 View“helperPath”注册? Cms 命名空间不应该包含 Cms/View/Helper 命名空间吗?

有人可以澄清一下吗:)

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

    View Helpers 被认为是特定于应用程序的,因此在Recommended Project Directory Structure View Helpers 中应该放置在 application/views/helpers 中。这意味着,如果 ZF 仅解析常规化的类名,通常不会找到它们。

    当您从 View 调用带有 $this->helperName()$this->getHelper('HelperName') 的帮助程序时,View 将使用具有配置的前缀和路径的 PluginLoader 来获取该帮助程序并注入当前的 View 实例。详情见源代码:

    换句话说,当加载 ViewHelper 时,您并没有使用 Autoloader。见:

    【讨论】:

    • @gordon - 你怎么对 zend 框架了解这么多? :) 你知道每一堂课吗?我只是好奇,因为我正在准备 Zend Framework 认证。
    • @Andre 我不太了解 ZF。我通常只查看参考指南以了解显而易见的内容,如果没有解释,我会查看源代码。
    • 鉴于 zend 文档的当前状态,这是一大堆源代码检查:)
    • @Andre 我经常听到这种抱怨,但不要认为指南和 API 文档太简陋。大多数时候我不需要深入研究源代码。通常只有当我想了解为什么组件以某种方式工作时,而不是当我需要弄清楚如何使用组件时。
    • @Gordon:这里也一样;)我完全不明白这些抱怨。顺便说一句:真的很喜欢你的帖子;)
    【解决方案2】:

    这是直接取自我的 application.ini 文件之一。

    autoloaderNamespaces.Foo = "Foo"
    includePaths.library = APPLICATION_PATH "/../library"
    

    我的“Foo”库位于库目录 - library/Foo。到目前为止,我所做的只是使“Foo”库在包含路径中可用。

    我需要为视图的默认列表添加一个单独的帮助程序路径,否则视图将不会在该目录中查找匹配的视图帮助程序。我认为加载视图助手是直接发现。该视图需要明确说明在哪里寻找帮助程序。

    【讨论】:

      【解决方案3】:

      我相信正如您所描述的那样,documentation on custom view helpers 对此非常明确:

      您可以并且应该为类名添加前缀,建议您使用“View_Helper”作为该前缀的一部分:“My_View_Helper_SpecialPurpose”。 (您需要将前缀(带有或不带有尾随下划线)传递给 addHelperPath() 或 setHelperPath())。

      这对我来说确实有些道理。从理论上讲,您可以构建一个通用视图助手库,可以在多个应用程序中重复使用,因此将它们绑定到特定的应用程序命名空间会很不方便,即如果我的所有助手都以“MyApp_”为前缀,我将不得不将它们重命名为能够在“MyOtherApp”中使用它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 2012-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多