Могу ли я получить имя соединения из Propel-соединения?

#php #connection #propel

#php #соединение #propel

Вопрос:

Я использую 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;
}
  

Поскольку экземпляр объекта connection создается путем указания имени соединения (или принятия имени по умолчанию) Я бы подумал, что это будет сохранено в объекте. Но беглый просмотр кода, похоже, указывает на то, что он используется только для поиска сведений о соединении и сам по себе не сохраняется.

Я что-то пропустил, или мне следует отправить это как предложение для Propel2? 🙂

Ответ №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;
    }
}
  

Это дает каждому соединению строковое представление (чтобы использовать его, я добавил ключ ‘classname’ в свой runtime 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];
}
  

Кажется, пока работает 🙂