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' 我的问题是:
发布于 2011-05-16 14:53:59
实际上,您可能不想为此使用资源自动加载程序,因为(正如您已经发现的)它需要一个命名空间。标准的自动加载器(从包含路径加载模型)有一个选项setFallbackAutoloader,它告诉ZF自动加载器应该用于任何不匹配另一个名称空间的类。因此,您所需要做的就是确保您的模型目录位于包含路径上,并将此选项设置为true。
您可能已经使用标准的自动加载器加载Zend类,因此您可能希望修改application.ini文件,将模型目录添加到包含路径中,然后在application.ini或Bootstrap类中设置回退选项:
protected function _initAutoloader()
{
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
return $autoloader;
}发布于 2011-05-15 18:07:48
使用名称空间来确保您没有在不想要的类上使用autoload进程。因此,您必须为类选择一个命名空间。
可以使用特定于应用程序的命名空间启动类,也可以使用通用命名空间启动类。像'My_‘或'App_’这样的名称空间是通用的,但是,例如,如果您的应用程序名是作业板,您可以在类文件中使用'JB_‘这样的名称空间。
您还可以编写自己的自动加载程序(一个全新的自动加载程序,或者扩展Zend ),并将其注册为SPL自动机以绕过这个问题。
您的类名不必遵循Zend命名约定,只需确保它们有一个名称空间,并在autoloader中注册名称空间。
在这里,我附加了一段代码,它注册了一些要自动加载的资源。我有多个模块,每个模块都有一个关于该模块名称的名称空间。请注意,由于有许多名称空间,所以我将它们都注册在一个循环中。
$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‘(第一个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中删除。
https://stackoverflow.com/questions/6009626
复制相似问题