Zend framework Zend自动加载模型问题

Zend framework Zend自动加载模型问题,zend-framework,namespaces,zend-autoloader,Zend Framework,Namespaces,Zend Autoloader,Zend框架。 我想在models文件夹中,从bootstrap类中自动加载我的模型类。 这些模型实际上没有使用任何名称空间(所以我有Ex.User.php文件的类User等等) 如果我理解正确,我应该使用Zend_Loader_Autoloader_资源,我尝试了: function _initLoaderResource() { $resourceLoader = new Zend_Loader_Autoloader_Resource(array(

Zend框架。 我想在models文件夹中,从bootstrap类中自动加载我的模型类。 这些模型实际上没有使用任何名称空间(所以我有Ex.User.php文件的类User等等)

如果我理解正确,我应该使用Zend_Loader_Autoloader_资源,我尝试了:

function _initLoaderResource() 
{         
    $resourceLoader = new Zend_Loader_Autoloader_Resource(array(                 
    'basePath'  => APPLICATION_PATH,//points to the "application" path where resides "models" folder
    'namespace' =>''       
    ));         

    $resourceLoader->addResourceType('models', 'models/');

} 
我收到以下“Zend_Loader_Exception”消息:

'Initial definition of a resource type must include a namespace' 
我的问题是:

  • 这是自动加载模型的正确方法吗?
  • 如何管理不遵循Zend Framework编码标准的资源代码?

Zend Autoloader使用名称空间来确保您没有在不需要的类上使用自动加载过程。因此,您必须为类选择名称空间

您可以使用特定于应用程序的命名空间或通用命名空间来启动类。 像“My_uu”或“App_uu”这样的名称空间是通用的,但是,例如,如果应用程序名称是Job Board,则可以在类文件中使用像“JB_uu”这样的名称空间

您也可以编写自己的自动加载器(或者是全新的自动加载器,或者通过扩展Zend自动加载器),并将其注册为可绕过此功能的

您的类名不必遵循Zend Framework命名约定,只需确保它们具有名称空间并在自动加载程序中注册名称空间即可

这里我附加了一段代码,它注册了一些要自动加载的资源。我有多个模块,每个模块都有一个关于该模块名的名称空间。请注意,因为有许多名称空间,所以我将它们全部注册到一个循环中

    $nameSpaceToPath = array(
                            'Application'   => APPLICATION_PATH,
                            'Base'          => APPLICATION_PATH . '/base',
                            'Store'     => APPLICATION_PATH . '/modules/Store',
                            'Payment'     => APPLICATION_PATH . '/modules/Payment',
                            'Admin'     => APPLICATION_PATH . '/modules/Admin'
                        );

    foreach($nameSpaceToPath as $ns => $path) {
        $autoLoaderResource = new Zend_Loader_Autoloader_Resource(
                            array(
                                'basePath' => $path,
                                'namespace' => $ns
                            )
                        );
        $autoLoaderResource->addResourceType('controller','controllers','Controller');
        $autoLoaderResource->addResourceType('model','models','Model');
        $autoLoaderResource->addResourceType('mapper','models/mappers','Model_Mapper');
        $autoLoaderResource->addResourceType('service','services','Service');
        // I'm using _Util_ in the name of my utility classes, I place them in 'utils' directory
        $autoLoaderResource->addResourceType('util','utils','Util');
        $autoLoaderResource->addResourceType('plugin','plugins','Plugin');
        $autoLoaderResource->addResourceType('form','forms','Form');
        // I'm using _Exception_ in the name of my module specific exception classes, I place them in 'exceptions' directory
        $autoLoaderResource->addResourceType('exception','exceptions','Exception');
        $autoLoader->pushAutoloader($autoLoaderResource);
    }
通过调用定义资源类型时:

$autoLoaderResource->addResourceType('service','services','Service');
您实际上是在告诉Zend Autoloader您有一个类型“service”(第一个参数),它位于名为“services”(第二个参数)的目录中,并且您在类名中使用“service”标记来指定此类型的类

上面的代码告诉Zend Autoloader在路径“APPLICATION\u path/modules/Store/services/Core.php”中搜索类Store\u Service\u Core


如您所见,我已为应用程序路径注册了通用“应用程序”命名空间。这意味着从Application_u开始的每个类都将从Application_u路径自动加载。例如,我有一个名为Application_Init的类,它使用了一些初始化任务,现在Zend从路径Application_path/Init.php自动加载它。

实际上,您可能不想为此使用资源自动加载程序,因为(正如您所发现的)它需要一个命名空间。标准自动加载器(从包含路径加载模型)有一个选项
setFallbackAutoloader
,该选项告诉ZF,该自动加载器应用于与另一个命名空间不匹配的任何类。因此,您需要做的就是确保您的models目录位于include路径上,并将此选项设置为true

您可能已经在使用标准自动加载程序加载Zend类,因此您可能需要修改application.ini文件,将模型目录添加到include路径,然后在application.ini或引导类中设置回退选项:

protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->setFallbackAutoloader(true);

    return $autoloader;
}

你的答案是完美的!!谢谢