単体テストの準備として、DI を使用した MVC を理解して実装するのに役立つ単純なプロジェクトを使用しています。サイトは、要求されたページに基づいて、異なるデータ テーブルを表示するだけです。問題は、データがさまざまなデータ ソース (mysql や oracle など) から取得される可能性があることです。そのため、DI を実装して、2 つを切り替えるために必要なコードを削減しようとしています。私の問題は次のとおりです。
1)データソース(mysql、oracle、または単純な古い配列)をインスタンス化し、それを必要とするオブジェクトに取得する場所(DIはこれに最適なパターンでもありますか)?
2) ソースに固有のデータクエリを配置する構造のどこに? 以下の例では、MySQL データベースにデータを照会するクラス Foo がありますが、後で Oracle データベースに移動する場合は、すべてを別の構文に書き直す必要があります。FooMysql と FooOracle の 2 つのバージョンを作成し、どちらを使用するかをどこかに指示するだけですか?
これは、私が見ている概念を示すいくつかの基本的で不完全なコードです。うまくいけば、私がこれでどこに向かっているのかを理解し、正しい方向に向けることができます. 私はすでに構築されたフレームワークを探していません。
$c = new Controller('foo');
print_r($c->getContent());
class Controller
{
private $view = null;
public function __construct($viewName)
{
$this->view = new $viewName($dbc); // where to get and pass dbc based on view
}
}
interface ViewInterface
{
public function getContent();
}
class FooView
{
private $foo = null;
public function __construct(DatabaseConnection &$dbc)
{
$this->foo = new Foo($dbc);
}
public function getContent()
{
return $this->foo->getAll();
}
}
class BarView
{
private $bar = null;
public function __construct(DatabaseConnection &$dbc)
{
$this->bar = new Bar($dbc);
}
public function getContent()
{
return $this->bar->getAll();
}
}
interface StorageInterface
{
public function getAll();
}
class Foo implements StorageInterface
{
private $dbc = null;
public function __construct(DatabaseConnection &$dbc)
{
$this->dbc = $dbc;
}
public function getAll()
{
// mysql code to get all foos
}
}
class Bar implements StorageInterface
{
private $dbc = null;
public function __construct(DatabaseConnection &$dbc)
{
$this->dbc = $dbc;
}
public function getAll()
{
// oracle code to get all bars
}
}