Zend Autoloading模型问题

时间:2011-05-15 16:16:52

标签: zend-framework namespaces zend-autoloader

Zend框架。 我想在 bootstrap 类中自动加载 models 文件夹中的模型类。 这些模型实际上并没有使用任何命名空间(所以我有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编码标准的资源代码?

2 个答案:

答案 0 :(得分:5)

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

您可能已经在使用标准自动加载器来加载Zend类,因此您可能希望修改application.ini文件以将模型目录添加到包含路径,然后在应用程序中设置回退选项。 ini或你的Bootstrap类:

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

    return $autoloader;
}

答案 1 :(得分:1)

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

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

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

您的类名不必遵循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_PATH / modules / store / services / Core.php'中搜索类Store_Service_Core。

正如您所看到的,我已经为APPLICATION_PATH路径注册了一般的'Application'命名空间。这意味着从Application_ATH开始的每个类都将从APPLICATION_PATH自动加载。所以例如我有一个名为Application_Init的类,它使用一些初始化任务,现在Zend从路径APPLICATION_PATH / Init.php自动加载它。