也许我一直在盯着这个问题太长时间,这比我想象的要简单得多,但我现在卡住了。
我有三个网站将共享数据库模型。我构建了我的应用程序,以便每个站点都有一个应用程序目录,每个站点都有一个公共目录。 DB模型与Zend Framework和我的第三方库一起存在于库中的目录中。我使用Autoloader类,当我尝试实例化我的一个DB类时,它失败了。库目录位于我的include路径中,但无论出于何种原因,它都拒绝实例化我的类。
如果我的模型在我的应用程序目录中,它将起作用,但这不是重点。它们应该是库中的共享类。
$model = new Model_Login();
$model->hello_world();
当它在库中时失败。这堂课只是一个考验:
class Model_Login
{
public function hello_world()
{
echo "hello world";
}
}
一切正常,直到我尝试实例化我的一个模型。我甚至尝试将类重命名为其他东西(Db_Login),但这也不起作用。有任何想法吗?提前谢谢。
Bootstrap中的Autoloader:
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => dirname(__FILE__),
));
答案 0 :(得分:3)
在你的引导程序中使用
protected function _initAutoload() {
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Default_',
'basePath' => dirname(__FILE__),
));
$autoloader->addResourceType('models', 'models/', 'Models');
return $autoloader;
}
然后只需命名您的对象:
$model = new Default_Models_Login();
$model->hello_world();
答案 1 :(得分:1)
我会使用库目录来存储所有这些模型。该目录可以由所有站点共享。
我有以下目录:
应用
CONFIGS
模型
控制器
视图
图书馆
myns名字
的Zend
公共
我的配置我有:
includePaths.library = APPLICATION_PATH "/../library"
autoloaderNamespaces.Myns = Myns_
允许我在Myns中存储文件并调用: Myns_Login
答案 2 :(得分:1)
好的,您正在引导程序中使用模块自动加载器。它被设计用于模块引导,因为它只搜索一个目录树(通常是应用程序/模块中的特定目录),而不是使用包含路径。它可以在主引导程序中用作默认模块的自动加载器,这就是为什么当你将它放在应用程序/模型中时你的类工作。
我认为您想切换到使用标准自动加载器。
我假设你的引导课你现在有这样的东西:
protected function _initAutoloader()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => dirname(__FILE__),
));
return $autoloader;
}
将其更改为:
protected function _initAutoloader()
{
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
return $autoloader;
}
这将设置自动加载器(默认情况下也会为Zend Framework类设置自动加载),然后告诉它将此自动加载器用于任何不匹配的命名空间(因为您的类没有命名空间)。使用这种方法,您可以将使用PEAR命名约定的任何类放入库目录中,并在代码中使用它。
或者你可以这样做:
protected function _initAutoloader()
{
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('Model');
return $autoloader;
}
设置自动加载器,然后告诉它使用此自动加载器作为命名空间“Model”,它将匹配您的Model_Login类。
答案 3 :(得分:1)
嗯,我有类似的问题,花了半天时间试图解决这个问题。在试验之后,您实际上可以坚持使用模块的默认自动加载器:
protected function _initAutoload() {
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Default_',
'basePath' => dirname(__FILE__),
));
$autoloader->addResourceType('models', 'models/', 'Models');
return $autoloader;
}
确保相应地调整basePath值,以便它可以获取Application文件夹中的Model文件夹。
对于我的,我使用3x dirname修复它,因为模型文件夹几乎没有升级我的模块引导程序文件。申请>模块>默认