データベースにバインドされたオブジェクトを作成するための素晴らしいパターンを楽しみにしています。ユーザーの作成という簡単な例で自分の考えを説明します。
最初:ユーザーを作成/ロードするファクトリメソッド。ユーザー設定は、新しく作成されたインスタンスで行われます。
$user = User::Create($db); // Flag the instance to create an user when save() is called
$user->setUsername('...');
$user->set...;
$user->save(); // Will insert a new user into the database.
...
$user = User::Load($db, id); // Load an user from the database. Flag object to update.
$user->setUsername('...'); // Change username.
$user->save(); // Update existing object instead of inserting a new one.
2番目:すぐに新しいユーザーを作成するファクトリメソッド。
User::Create($db, $username, $password, ...); // Create and insert a new user.
...
$user = User::Load($db, 1);
$user->setUsername("..."); // Change username.
$user->save(); // Save only updates a user, no flag needed because an user is entirelly created by User::Create().
3番目:静的ファクトリメソッドでファクトリクラスを使用します。
Factory::newUser($db, $username, $password, ...); // May contain many other types of objects.
そして、私は常にこのようなことをすることができます:
$factory = new Factory($db);
$user = $factory->newUser($username, $password, ...);
もう1つは、オブジェクトを作成するためにアプリケーションで使用されるデータベースへのハンドルを提供するシングルトンを作成する必要がありますか(オブジェクト内のハンドルをハードコーディングすることなく)?
例:
class DB {
public static function handle() { /* Do a lazy connection to a database once. */ }
}
...
$user = User::Create(DB::handle(), ...);
だから、私の本当の質問は、最高のパターンは何ですか?これは相対的すぎる可能性があることは知っていますが、いくつかのヒントが必要です。もちろん、依存関係をオブジェクトの内部にハードコーディングするのではなく、外部に残したいと思います。
前もって感謝します。