私はMVCっぽい構造は初めてなので、気楽にやってください。目的を理解するために、独自の小さな MVCish「フレームワーク」をコーディングしています。少しずつ、すべてが正しい方法でどのように組み合わされるかを理解するつもりです。
MVC でモデルをどのように構築する必要がありますか? teresko によるものであり、Domain Object != Domain Object Collection
ドメイン オブジェクトの一括作成とコレクションへのそれぞれの挿入を処理する方法を見つけようとしています。
彼の例では、単一の ServiceFactory インスタンスをコントローラーとビューの両方に渡します。このインスタンスには、そのコンストラクターに注入された MapperFactory と DomainObjectFactory があります。コレクションファクトリーはありません。
$serviceFactory = new ServiceFactory(
new DataMapperFactory($dbhProvider),
new DomainObjectFactory
);
/*
* Initialization of View
*/
$class = '\\Application\\View\\' . $request->getResourceName();
$view = new $class($serviceFactory);
$view->setDefaultTemplateLocation(__DIR__ . '/templates');
/*
* Initialization of Controller
*/
$class = '\\Application\\Controller\\' . $request->getResourceName();
$controller = new $class($serviceFactory, $view);
ServiceFactory.php は次のようになります
class ServiceFactory
{
private $domObjFactory;
private $mapperFactory;
private $services = array();
public function __construct(MapperFactory $mapperFactory, DomObjFactory $domObjFactory)
{
$this->mapperFactory = $mapperFactory;
$this->domObjFactory = $domObjFactory;
}
public function create($name)
{
if ( array_key_exists($name, $this->services) === false )
{
$serviceName = '\Vendor\\'.$name.'Service';
$this->services[$name] = new $serviceName($this->mapperFactory, $this->domObjFactory);
}
return $this->services[$name];
}
}
例として、呼び出されたドメイン オブジェクトがContract
あり、ビューでそれらすべてをリストに表示したいとします。おそらく「モデル」に のようなものを伝える必要$ContractService->fetchAll()
があります。これは、コレクションをインスタンス化し、マッパーにすべてのコントラクトを入力するように指示します。右?
コレクションにはドメイン オブジェクトが含まれている必要があり、そのようなメソッド$ContractMapper->fetchAll($collection)
はおそらくそれらの束を作成する必要があることを考えると、それらの作成を処理する方法!?
- 専用のコレクション ファクトリも用意する必要がありますか?
- コレクション オブジェクト内のメソッドで単一のドメイン オブジェクトを作成する必要がありますか?
- Collection Mapper 内のメソッドで単一のドメイン オブジェクトを作成する必要がありますか?
- もしそうなら、ドメイン オブジェクト ファクトリをそれらの 1 つに挿入する必要がありますか? (これには、より多くの Factory 依存関係が注入された ServiceFactory が必要になる可能性がありますが、これは悪いことですよね?)
これは、コーディングが不十分な方法で簡単に実現できると思いますが、最もエレガントでクリーンなソリューションを見つけようとしています。