最初から複数の接続を扱えるようにDoctrineは設計されてきました。個別に指定しない限りDoctrineはクエリの実行には現在の接続を使います。
この章ではDoctrineの接続の作成と扱い方を示します。
Doctrine_ManagerはスタティックメソッドのDoctrine_Manager::connection()を提供します。このメソッドは新しい接続を開きます。
この例では新しい接続を開く方法を示しています:
// test.php
// ...
$conn = Doctrine_Manager::connection('mysql://username:password@localhost/test', 'connection 1');
Doctrine_Manager::connection()メソッドを使用し引数を渡さない場合現在の接続が返されます:
// test.php
// ...
$conn2 = Doctrine_Manager::connection();
if ($conn === $conn2) {
echo 'Doctrine_Manager::connection() returns the current connection';
}
現在の接続は最後に開いた接続です。次の例ではDoctrine_Managerインスタンスから現在の接続を取得する方法が示されています:
// test.php
// ...
$conn2 = Doctrine_Manager::connection('mysql://username2:password2@localhost/test2', 'connection 2');
if ($conn2 === $manager->getCurrentConnection()) {
echo 'Current connection is the connection we just created!';
}
Doctrine_Manager::setCurrentConnection()を呼び出すことで現在の接続を変更できます。
// test.php
// ...
$manager->setCurrentConnection('connection 1');
echo $manager->getCurrentConnection()->getName(); // connection 1
foreach句にマネージャーオブジェクトを渡すことで開いた接続をイテレートできます。Doctrine_Managerが特殊なIteratorAggregateインターフェイスを実装するのでこれは可能です。
// test.php
// ...
foreach($manager as $conn) {
echo $conn->getName() . "\n";
}
次のコードでDoctrine_Connectionインスタンスの名前を簡単に取得できます:
// test.php
// ...
$conn = Doctrine_Manager::connection();
$name = $manager->getConnectionName($conn);
echo $name; // connection 1
接続を閉じたりDoctrine接続レジストリから削除のは簡単です:
// test.php
// ...
$conn = Doctrine_Manager::connection();
$manager->closeConnection($conn);
接続を閉じるがDoctrine接続レジストリから削除したくない場合は次のコードが利用できます:
// test.php
// ...
$conn = Doctrine_Manager::connection();
$conn->close();
Doctrine_Manager::getConnections()メソッドを使用して登録されたすべての接続の配列を読み取ることができます:
// test.php
// ...
$conns = $manager->getConnections();
foreach ($conns as $conn) {
echo $conn->getName() . "\n";
}
上記のコードは初期の頃にDoctrine_Managerオブジェクトをイテレートすることと同じです。再度掲載します:
// test.php
// ...
foreach ($manager as $conn) {
echo $conn->getName() . "\n";
}
Countableインターフェイスを実装するのでDoctrine_Managerオブジェクトから接続数を取得できます。
// test.php
// ...
$num = count($manager);
echo $num;
上記のコードは次のコードと同じです:
// test.php
// ...
$num = $manager->count();
Doctrineを使用して接続を作成するとき、これらの接続に関連するデータベースの作成と削除する機能が簡単に手に入ります。
Doctrine_ManagerもしくはDoctrine_Connectionクラスで提供されるメソッドを使うことで簡単にできます。
次のコードではインスタンス化された接続をすべてイテレートしてdropDatabases()/createDatabases()メソッドを呼び出します:
// test.php
// ...
$manager->createDatabases();
$manager->dropDatabases();
特定の接続に対してデータベースを削除/作成する
接続インスタンスでdropDatabase()/createDatabase()メソッドを呼び出すことで特定のDoctrine_Connectionインスタンス用のデータベースを削除もしくは作成できます:
// test.php
// ...
$conn->createDatabase();
$conn->dropDatabase();
ときには独自のカスタム接続クラスを作りこれらを活用する機能が必要になることがあります。mysqlを拡張するもしくは独自のデータベース型を独自に書くことが必要になることがあります。これはいくつかのクラスを書き接続型をDoctrineに登録することで可能です。
カスタム接続を作成するにはまず次のクラスを書く必要があります。
class Doctrine_Connection_Test extends Doctrine_Connection_Common
{
}
class Doctrine_Adapter_Test implements Doctrine_Adapter_Interface
{
// ... all the methods defined in the interface
}
ではこれらをDoctrineに登録します:
// bootstrap.php
// ...
$manager->registerConnectionDriver('test', 'Doctrine_Connection_Test');
次のような少しの変更でこれが実現されます:
$conn = $manager->openConnection('test://username:password@localhost/dbname');
接続にどんなクラスが使われるのか確認すればそれらが上記で定義したクラスであることがわかります。
echo get_class($conn); // Doctrine_Connection_Test
echo get_class($conn->getDbh()); // Doctrine_Adapter_Test
Doctrineの接続すべてを学びましたのでIntroduction to Modelsの章でモデルに直に飛び込む準備ができました。Doctrineのモデルも少し学びました。少し遊んで最初のテストモデルを作成しDoctrineが提供するマジックを見ることになります。