Могу ли я получить имя соединения от соединения Propel? - PullRequest
1 голос
/ 13 ноября 2011

Я использую 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?:)

1 Ответ

1 голос
/ 13 ноября 2011

Правильно, я обнаружил, что внутри 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];
}

Кажется, работает до сих пор:)

...