モデルについて
実際、モデルはそもそもクラスにありません。モデルは、多数のオブジェクトを含むレイヤーです。モデル層のクラスインスタンスの2つの主要なグループには、次のいずれかの責任があります。
- ドメインビジネスロジックとルール:ドメインオブジェクトによって実装されます(1) (2)
- データアクセスと永続性:通常、データマッパーとして実装されます(3)
コードでは、次のようになります。
$user = $factory->buildObject('user');
$mapper = $factory->buildMapper('user');
$user->setId( 42 );
$mapper->fetch($user);
$now = time();
if ( $user->hasStatus( User::STATUS_LOCKED ) && !$user->isBanned( $now ) )
{
$user->setStatus( User::STATUS_AVAILABLE );
}
$mapper->commit($user);
お気づきかもしれませんが、ビジネスオブジェクトが実際にデータベースと対話することはありません。またはそれを認識しています。情報がプレーンテキストファイルに保存されているか、リモートREST APIを介して保存されているか、noSQLに保存されている可能性があります。ドメインオブジェクトはそれを気にしません。すべてのストレージはマッパーによって処理されます。請求書の作成を管理するビジネスロジックは、請求書に関する情報の出所に依存しません。
接続について
OOPを使用しているので、それを利用することができます。この例を考えてみましょう。
class Test
{
protected $ob = null;
public function __construct( $ob )
{
$this->ob = $ob;
}
public function get()
{
var_dump( $this->ob->data );
}
public function set( $val )
{
$this->ob->data = $val;
}
}
$object = new stdClass;
$foo = new Test($object);
$bar = new Test($object);
$foo->set('lorem ipsum');
$bar->get();
実行を確認するには:http://codepad.org/coCibwyk
Test
クラスの両方のインスタンスが同じインスタンスを共有していることに注意してください。コードでは、 PDOのインスタンスでも同じことができます。
そして、最初のコードを切り取ったようなものを使用している場合は、次のようにします。
class Factory
{
protected $connection = null;
public function __construct( $connection )
{
$this->connection = $connection;
}
public function buildMapper( $className )
{
$className = $className . 'Mapper';
$instance = new $className ;
$instance->useConnection( $this->connection );
return $instance;
}
// ... some other code
}
したがって、を使用する$mapper = $factory->buildMapper('user');
と、メソッドはすでに接続されているオブジェクトを作成します。