2

Zend 框架。我想从引导类中自动加载模型文件夹中的模型类。这些模型实际上并不使用任何命名空间(所以我有 Ex. User.php 文件的类名为 User 等等..)。

如果我理解正确,我应该使用Zend_Loader_Autoloader_Resource并且我尝试过:

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 编码标准的资源代码?
4

2 回答 2

5

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

您可能已经在使用标准自动加载器来加载 Zend 类,因此您可能需要修改 application.ini 文件以将模型目录添加到包含路径,然后在 application.ini 或你的引导类:

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

    return $autoloader;
}
于 2011-05-16T14:53:59.157 回答
1

Zend Autoloader 使用名称空间来确保您不使用自动加载过程,在那些您不想要的类上。所以你必须为你的类选择一个命名空间。

您可以使用特定于应用程序的名称空间或通用名称空间来开始您的类。像“My_”或“App_”这样的命名空间是通用的,但是例如,如果您的应用程序名称是 Job Board,您可以在类文件中使用像“JB_”这样的命名空间。

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

您的类名不必遵循 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 您有一个类型“服务”(第一个参数),它放置在名为“服务”(第二个参数)的目录中,并且您在类名中使用“服务”标记来指定类这个类型。

上面的代码告诉 Zend Autoloader 在路径 'APPLICATION_PATH/modules/store/services/Core.php' 中搜索类 Store_Service_Core。

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

于 2011-05-15T18:07:48.580 回答