我希望我的一个Zend Framework模块使用与其他模块不同的数据库。 The Manual suggests您可以使用模块名称为application.ini
中的资源添加前缀以实现此目的,但我无法使其正常工作。
我的application.ini
的相关位是:
resources.modules[] = "" resources.db.adapter = "PDO_MYSQL" resources.db.params.host = "localhost" resources.db.params.dbname = "maindb" resources.db.params.username = "dbuser" resources.db.params.password = "..." resources.db.params.charset = "utf8" terms.resources.db.params.dbname = "termsdb"
其中terms
是模块的名称。
我需要在Bootstrap中添加一些特殊功能才能使其正常工作吗?
答案 0 :(得分:0)
修改强>
关于OP下面的第一条评论......
不,我无法详细说明如何设置模块化数据库资源。我所提供的应该是理论上我相信的。如果它不确定需要在Zend_Application_Resource_Db
的扩展名中修改什么,因为我不知道我不使用该资源。我有自己的自定义资源,允许多个dbs并根据唯一的连接名称获取这些数据库连接。不过我可以说清楚: - )
所以我有一个MyLib_Db
类扩展Zend_Db
它看起来像这样:
class MyLib_Db extends Zend_Db
{
protected $_instance = null;
protected $_connections = array();
/**
* Standard Zend Framework unified constructor
* @param null|array An array of options that will be passed to setOptions
*/
public function __construct($options = null)
{
}
/**
* Standard Zend Framework setOptions implementation
* @param array $options and array of options from config
* @return MyLib_Db
*/
public function setOptions(array $options)
{
}
/**
* Set the class instance
* @param MyLib_Db
* @return MyLib_Db
*/
public static function setInstance($instance)
{
}
/**
* Get/create the singleton instance
* @return MyLib_Db
*/
public static function getInstance()
{
}
/**
* Get a Zend_Db adapter Instance by unique name
* Searches self::$_connections for the $name param as an array key
* @param String $name unique connection name
* @return Zend_Db_Adpater_Abstract|null
*/
public function getConnection($connectionName)
{
}
/**
* Add a connection instance to the registry
* Adds/creates an Zend_Db_Adapter instance to the connection registry with
* the string key provided by $name. If $connection is an array|Zend_Config it
* should match the format used by Zend_Db::factory as it will be passed to this
* function. If $name is null then the database name will be used.
* @param Zend_Db_Adapter_Abstract|Zend_Config|array The connection to register
* @param string|null $name A unique name for the connection
* @return MyLib_Db
*/
public function addConnection(Zend_Db_Adapter_Abstract $connection, $name = null)
{
}
/**
* Remove/Destroy the specified connection from the registry
* @param string $name the connection name to remove
* @return MyLib_Db
*/
public function removeConnection($name)
{
}
}
基本上我的DB应用程序资源创建并返回前一个类的实例。在创建过程中,它会创建我在配置中设置的任何适配器,并在这个类实例中使用名称注册它们(它还会查找用于Zend_Db_Table
的默认标志以及执行其他操作)。
然后我使用MyLib_Db::getInstance()->getConnection($name);
或者我从引导程序中获取MyLib_Db
实例,然后调用getConnection
。
我个人更喜欢这样做,因为它不依赖于应用程序范围内的连接或绑定到特定模块,从而允许更灵活的重用。那说我实际上只在几个项目中使用过这个,因为在我的Zend项目中,我一直在使用Doctrine而不是Zend_Db
。
希望有所帮助: - )
实际上我认为您需要将其放在配置中的模块部分modules.terms.resources.db.*
中。这应该使它加载到模块引导程序中。或者,您可以使用_initDb
中的Terms_Bootstrap
进行设置。
我个人虽然使用了一个特殊的数据库管理类,而是把它放在我的资源中 - 它处理设置一个或多个适配器。然后在下面指出$db
是从资源数组中检索的管理器......
$dbAdapter = $db->getConnection('terms');
答案 1 :(得分:0)
请执行以下操作:
moduleName.host = "localhost"
moduleName.username = "user"
moduleName.password = "pass"
moduleName.dbname = "dbname"
moduleName.charset = "utf8"
然后在任何init函数
中的Module的Bootstrap.php中添加以下内容$params = $GLOBALS['application']->getOption('moduleName');
$dbAdapter = Zend_Db::factory('PDO_MYSQL', array(
'host' => $params['host'],
'dbname' => $params['dbname'],
'username' => $params['username'],
'password' => $params['password'],
'charset' => $params['charset'],
));
Zend_Registry::set('moduleSpecific', $dbAdapter);
然后在你的模块的model/DbTable/
文件夹中创建一个类,如下所示,让你的表classess扩展ModuleName_Model_DbTable_Tablemain而不是Zend_Db_Table_Abstract,你就可以了。
class ModuleName_Model_DbTable_Tablemain extends Zend_Db_Table_Abstract
{
/**
*
* wrapper class constructor used to set db adaptor on the fly
* @author Krishan
*/
function __construct(){
parent::__construct($adapter = Zend_Registry::get('moduleSpecific'));
}
}
如果有任何问题,请告诉我