Php 数据库模型在Zend Framework中的位置-希望集中化
也许我盯着这个问题看得太久了,它比我想象的要简单得多,但我现在陷入了困境 我有三个网站将共享数据库模型。我对我的应用程序进行了结构化,这样每个站点都有一个应用程序目录,每个站点都有一个公共目录。DB模型与Zend Framework和我的第三方库一起位于库中的一个目录中。我使用Autoloader类,当我尝试实例化我的一个DB类时,它失败了。库目录位于我的include路径中,但出于任何原因,它拒绝实例化我的类 如果我的应用程序目录中有我的模型,它就会工作,但这不是重点。它们应该是图书馆中的共享类Php 数据库模型在Zend Framework中的位置-希望集中化,php,zend-framework,Php,Zend Framework,也许我盯着这个问题看得太久了,它比我想象的要简单得多,但我现在陷入了困境 我有三个网站将共享数据库模型。我对我的应用程序进行了结构化,这样每个站点都有一个应用程序目录,每个站点都有一个公共目录。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),但这也不起作用。有什么想法吗?提前谢谢
从引导程序自动加载程序:
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => dirname(__FILE__),
));
我将使用库目录来存储所有这些模型。该目录可由所有站点共享 我有以下资料: 应用
- 配置
- 模型
- 控制器
- 观点
- 明斯
- 泽德
includePaths.library = APPLICATION_PATH "/../library"
autoloaderNamespaces.Myns = Myns_
允许我将文件存储在Myns中并调用:
Myns_登录我将使用库目录存储所有这些模型。该目录可由所有站点共享 我有以下资料: 应用
- 配置
- 模型
- 控制器
- 观点
- 明斯
- 泽德
includePaths.library = APPLICATION_PATH "/../library"
autoloaderNamespaces.Myns = Myns_
允许我将文件存储在Myns中并调用:
Myns\u登录在引导程序中使用
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();
在引导过程中使用
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();
好的,您正在引导中使用模块自动加载程序。它设计用于模块引导,因为它只搜索一个目录树(通常是应用程序/模块中的特定目录),而不是使用include路径。它可以在主引导中用作默认模块的自动加载程序,这就是为什么将类放入应用程序/模型中时可以工作的原因
我想你应该改用标准的自动装弹机
我假设在您的引导类中,您当前有如下内容:
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\u登录类。好的,您正在引导中使用模块自动加载器。它设计用于模块引导,因为它只搜索一个目录树(通常是应用程序/模块中的特定目录),而不是使用include路径。它可以在主引导中用作默认模块的自动加载程序,这就是为什么将类放入应用程序/模型中时可以工作的原因
我想你应该改用标准的自动装弹机
我假设在您的引导类中,您当前有如下内容:
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\u登录类。好吧,我也遇到了类似的问题,花了半天时间试图解决它。在试验之后,您实际上可以坚持使用模块的默认自动加载器:
protected function _initAutoload() {
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Default_',
'basePath' => dirname(__FILE__),
));
$autoloader->addResourceType('models', 'models/', 'Models');
return $autoloader;
}
确保您相应地调整了basePath值,以便它可以获取应用程序文件夹中的Model文件夹
对于我的,我用3x dirname来修复它,因为model文件夹在我的模块引导文件中很少。应用程序>模块>默认值嗯,我也有类似的问题,我花了半天的时间试图解决它。在试验之后,您实际上可以坚持使用模块的默认自动加载器:
protected function _initAutoload() {
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Default_',
'basePath' => dirname(__FILE__),
));
$autoloader->addResourceType('models', 'models/', 'Models');
return $autoloader;
}
确保您相应地调整了basePath值,以便它可以获取应用程序文件夹中的Model文件夹
对于我的,我用3x dirname来修复它,因为model文件夹在我的模块引导文件中很少。应用程序>模块>默认设置这正是我想要做的,但是自动加载器没有很好地发挥作用。无法找出原因。自动加载程序不会自动设置命名空间。在配置中声明库之后,添加autoloaderNamespaces指令:autoloaderNamespaces.Myns=Myns\u是否应该将自动加载程序指向正确的目录?我不确定我是否理解名称空间如何适合这里。我想得太多了。我不需要在application.ini中添加一个指令来更改我寻找模型的路径吗?我该怎么做?这就是我想做的,但是自动装弹机打得不好。无法找出原因。自动加载程序不会自动设置命名空间。在配置中声明库之后,添加autoloaderNamespaces目录