2011-11-13 23 views
1

Propel 1.6.xを使用していて、Propel Connectionオブジェクトから接続名を取得できるようにしたいと考えています。これにより、シングルトン方法でオブジェクトのストレージを容易にすることである。Propel接続から接続名を取得できますか?

// 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

私は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]; 
} 

は、これまで動作しているようです:)

関連する問題