首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend Autoloading模型问题

Zend Autoloading模型问题
EN

Stack Overflow用户
提问于 2011-05-15 16:16:52
回答 2查看 3.1K关注 0票数 2

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

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

代码语言:javascript
复制
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”信息:

代码语言:javascript
复制
'Initial definition of a resource type must include a namespace' 

我的问题是:

  • ,这是自动建模的正确方式吗?
  • 如何管理不符合Zend编码标准的资源代码?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-16 14:53:59

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

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

代码语言:javascript
复制
protected function _initAutoloader()
{
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->setFallbackAutoloader(true);

    return $autoloader;
}
票数 5
EN

Stack Overflow用户

发布于 2011-05-15 18:07:48

使用名称空间来确保您没有在不想要的类上使用autoload进程。因此,您必须为类选择一个命名空间。

可以使用特定于应用程序的命名空间启动类,也可以使用通用命名空间启动类。像'My_‘或'App_’这样的名称空间是通用的,但是,例如,如果您的应用程序名是作业板,您可以在类文件中使用'JB_‘这样的名称空间。

您还可以编写自己的自动加载程序(一个全新的自动加载程序,或者扩展Zend ),并将其注册为SPL自动机以绕过这个问题。

您的类名不必遵循Zend命名约定,只需确保它们有一个名称空间,并在autoloader中注册名称空间。

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

代码语言:javascript
复制
    $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);
    }

当您通过以下方式定义资源类型时:

代码语言:javascript
复制
$autoLoaderResource->addResourceType('service','services','Service');

实际上,您正在告诉Zend Autoloader,您有一个类型'service‘(第一个param),它放在名为'services’的目录中(第二个param),并且在类名中使用'Service‘令牌来指定这种类型的类。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6009626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档