0

私がMVCで知っているように、モデルは常にデータベースに接続します。例:

class a extends Model {
...
}


class Model {
    public function __construct() {
        $db = new database;
        $db->connect('localhost','root','','example');
    }
}

ただし、より多くのモデルが常に実行されている場合は、データベースで構成を取得します。したがって、Web サイトを実行する場合は 2 つのモデルが使用されます。これは 2 データベースへの接続に相当するため、多くの人が私の Web サイトにアクセスしたときにシステムに影響を与えます (200 リクエスト = 400 データベースへの接続)。

4

1 に答える 1

0

モデルについて

実際、モデルはそもそもクラスにありません。モデルは、多数のオブジェクトを含むレイヤーです。モデル層のクラスインスタンスの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');と、メソッドはすでに接続されているオブジェクトを作成します。

于 2012-04-25T12:16:21.097 に答える