我试图在zend框架中的应用程序文件夹中添加一个新文件夹,但是我在新文件夹中创建的类都找不到。
我得到的是这样的结构:
application/
models/
modules/
services/
Test.php
我尝试调用类Test.php:
class Service_Test{
}
$test = new Service_Test()
这会导致错误:PHP警告:include_once():打开'Service/Test.php'包含失败(include_path='…')在库/Zend/Loader.php第146行。
(include_path包含一个目录列表,为了保护隐私,我删除了它)。
我认为服务会像模型一样被自动发现。有人知道我如何使Zend框架找到服务文件夹吗?
我也试过了:
require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => ROOT_PATH . '/application',
'namespace' => 'Service',
));
PHP致命错误:Class 'Service_Test' not found
在你的bootstrap
protected function _initNamespace(){
Zend_Loader_Autoloader::getInstance()->registerNamespace('Service_');
}然后调用调用任何以'Service_'开头的类
感谢大家的帮助。我终于弄明白是怎么回事了。我正在工作的网站有一个非典型的设置。它没有扩展任何Zend框架引导类,也没有调用Zend_Application。自动加载类的方法是:
set_include_path(ROOT_PATH . '/application/models'.PATH_SEPARATOR .
ROOT_PATH . '/library'.PATH_SEPARATOR .
get_include_path());
require_once('Zend/Loader.php');
@Zend_Loader::registerAutoload();
我把它改成:
set_include_path(ROOT_PATH . '/application/models'.PATH_SEPARATOR .
ROOT_PATH . '/library'.PATH_SEPARATOR .
get_include_path());
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
$resources = new Zend_Loader_Autoloader_Resource(array(
'namespace' => '',
'basePath' => ROOT_PATH . '/application/',
));
$resources->addResourceTypes(array(
'service' => array(
'path' => 'services',
'namespace' => 'Service',
)));
从技术上讲,我不需要添加资源,但是如果我不这样做,并且仅仅依赖于将/application/services放入包含路径中,那么我将无法用'Service_'作为类的前缀。
我不确定我会推荐这种设置(没有Bootstrap类扩展或使用Zend_Application)给其他人。看看其他人对这种做法的看法会很有趣。好还是坏?无论如何,这就是我解决问题的方法。