我正在使用Propel 1.6.x,并希望能够从Propel Connection对象中检索连接名称。这是为了便于以单例方法存储对象,因此:
// If this is called twice with different connections,
// the second one will be wrong
protected function getHashProvider(PropelPDO $con)
{
static $hashProvider;
// Would like to use something like $con->getName() to
// store each instantiation in a static array...
if (!$hashProvider)
{
$hashProvider = Meshing_Utils::getPaths()->getHashProvider($con);
}
return $hashProvider;
}
由于通过提供连接名称(或接受默认名称)来实例化连接对象,我认为这将存储在对象中。但粗略地看一下代码似乎表明它只用于查找连接细节,而不是自己存储。
有什么我错过的,或者我应该将其作为Propel2的建议提交? :)
答案 0 :(得分:1)
是的,我发现在Propel中,Propel::getConnection()
根本没有将名称传递给PropelPDO类,所以它无法包含我需要的东西。这就是我如何解决这个限制的问题。
我认为连接需要有一个字符串标识符,所以首先我创建了一个新类来包装连接:
class Meshing_Database_Connection extends PropelPDO
{
protected $classId;
public function __construct($dsn, $username = null, $password = null, $driver_options = array())
{
parent::__construct($dsn, $username, $password, $driver_options);
$this->classId = md5(
$dsn . ',' . $username . ',' . $password . ',' . implode(',', $driver_options)
);
}
public function __toString()
{
return $this->classId;
}
}
这为每个连接提供了一个字符串表示(为了使用它,我在运行时XML中添加了一个'classname'键)。接下来,我修复单身,因此:
protected function getHashProvider(Meshing_Database_Connection $con)
{
static $hashProviders = array();
$key = (string) $con;
if (!array_key_exists($key, $hashProviders))
{
$hashProviders[$key] = Meshing_Utils::getPaths()->getHashProvider($con);
}
return $hashProviders[$key];
}
到目前为止似乎工作:)