Zend Framework Autoloader问题

时间:2011-02-26 14:45:06

标签: php zend-framework

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

'autoloaderNamespaces' => array(
    'Cms_'
)

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

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

Cms/View/Helper/

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

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

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

有人可以澄清这个:)

3 个答案:

答案 0 :(得分:4)

View Helpers被视为特定于应用程序,因此在Recommended Project Directory Structure View Helpers应该放在application / views / helpers中。这意味着,如果ZF只解决传统的类名,通常就找不到它们。

当您从View中调用$this->helperName()$this->getHelper('HelperName')的帮助程序时,View将使用带有配置的前缀和路径的PluginLoader来获取该帮助程序并注入当前的View实例。有关所有详细信息,请参阅sourcecode:

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

答案 1 :(得分:2)

这是直接来自我的一个application.ini文件。

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

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

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

答案 2 :(得分:1)

我相信它与您描述的完全一致,documentation on custom view helpers非常明确:

  

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

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