Zend资源自动加载器不适用于命名空间


Zend Resource Autoloaders not working for namespaces

我在Zend Framework上遇到了这种自动加载的困难。基本上,在库文件夹中有一个名为LunaZend的文件夹。LunaZend有一些可以在Zend Framework中使用的类,这些类具有命名空间,必须仅通过调用命名空间名称自动加载。命名空间类似于LunaZend''DB、LunaZend ''Etc。。。在引导程序中,我有一个_initAutoLoadNS函数,它有

$resource = new Zend_Loader_Autoloader_Resource(array(
                        'basePath'  =>  APPLICATION_PATH.'/../library/LunaZend/',
                        'namespace' => 'LunaZend')
       );

我希望能够在Zend框架中加载类,只需像一样调用

$t = new LunaZend'Di'DependencyInjector();

然而,我得到错误

致命错误:类未找到"LunaZend''Di''DependencyInjector"在里面我做错了什么?如何处理此命名空间自动加载问题?

谢谢。

是的,这个问题似乎偶尔会弹出,直到a掌握了ZF中名称空间(本地名称空间)的窍门。以下是我对此的看法。这是为所有只想正确加载使用命名空间的第三方的人准备的。这太简单了。

我使用ZF 1.11.11(根据文档,所有ZF 1.10+版本都有效)。

首先,从1.10开始,ZF支持本地PHP命名空间自动加载,前提是它们符合PSR-0标准。

我想在ZF1项目中添加Symfony2 EventManager组件
首先,和类名一样,名称空间必须和库中的路径匹配。因此,名称空间Symfony'Component'EventDispatcher'EventDispatcher映射到path/to/lib/Symfony/Component/EventDispatcher/EventDispatcher.php(其中path/to/lib/APPLICATION_PATH . '/library';您已经知道了)。我必须提到库文件夹必须在include_path中吗?不,我想我没有。

现在有一个不那么棘手的部分:

<?php
// bootstrap.php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initNsAutoload()
    {
        $loader = Zend_Loader_Autoloader::getInstance();
        $loader->registerNamespace('Symfony'); // this is why is dead simple
        /* Don't believe me? Try it:
        Zend_Registry::set('events', new Symfony'Component'EventDispatcher'EventDispatcher());
        */
    }
}

在控制器中使用命名空间导入怎么样?

<?php
use Symfony'Component'EventDispatcher'Event, 
    Symfony'Component'EventDispatcher'EventDispatcher;
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        var_dump(new EventDispatcher());
        var_dump(new Event());
    }
}

因此,只要您使用ZF1.10+,就不需要自定义自动加载器。这个回复是在我偷看之后做出的。

LE:或将其添加到应用程序.ini
autoloaderNamespaces[] = Symfony

AFAIK,ZF1自动加载器不处理真正的PHP 5.3命名空间类。要在真正的命名空间类上使用ZF1自动加载器,需要将分隔符变量配置为'。(感谢@Mattieu的更正)。但是Zend_Loader_Autoloader_Resource并没有像我们预期的那样处理路径映射。

您可以使用命名空间感知的自动加载器,比如Doctrine2或ZF2。将其中一个自动加载器推到标准ZF1自动加载器堆栈上应该可以处理它。

您可以使用application.ini加载一些命名空间。

我用了同样的

以下可以是application.ini的示例代码:-

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
appnamespace = "Application"
;Autoloader Namespace
autoloaderNamespaces.w = "LunaZend_"
相关文章: