2011-05-15 73 views
2

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

如果我理解正确,我应该用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编码标准的资源代码?

回答

5

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

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

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

    return $autoloader; 
} 
+0

Yu答案是完美的!谢谢 – 2013-05-22 11:49:44

+0

太棒了!谢谢! – Wiktor 2014-06-14 17:53:13

1

Zend Autoloader使用命名空间来确保您没有使用autoload进程,对那些你不想要的类。所以你必须为你的类选择一个名字空间。

您可以使用特定于应用程序的命名空间或通用命名空间来启动您的类。 像'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'); 

你实际上是告诉你有一种“服务”(第1 PARAM),这是摆在指定的目录Zend的自动装弹机'services'(第二参数),并且您在类名中使用'Service'标记来指定此类的类。

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

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