Правильно, я обнаружил, что внутри 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;
}
}
Это дает каждому соединению строковое представление (чтобы использовать его, я добавил ключ 'classname' в мой XML времени выполнения). Далее я чиню синглтон, таким образом:
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];
}
Кажется, работает до сих пор:)