2016-03-23 6 views
1

this questionのフォローアップは、 - 私はプロジェクトのオブジェクトがあるとし、これによりデータベースを知ることからProjectオブジェクトを保持し、挿入/更新/削除処理するためにProjectMapperオブジェクトを使用しています。データマッパーに多少の関連機能が含まれています - より良い場所がありますか?

プロジェクトにはいくつかのフォームが関連付けられている可能性があるので、ページをロードするときにProject populationを処理した後、プロジェクトに関連付けられたformIDのリストをデータベースからフェッチしてループさせる必要がありますFormオブジェクトを作成し、FormMapperオブジェクトを使用してフォームオブジェクトを生成します。

これは単純な十分な機能ですが、私はそれを置くべき場所はかなりよく分かりません。データベースと話しているので、ProjectオブジェクトやFormオブジェクトには入りません。それはProjectMapperオブジェクトに行くように思えるが、取得されたデータは、プロジェクトにマップするつもりはない - フォームにマッピングデータに使用することになるだろう。

上記のコードベースの表現:

$project = new Entity\Project; 
$projectMapper = new Mapper\Project($db); 

$project->setId(43); 
$projectMapper->load($project); //load() will take ID of passed object, fetch data from DB and call setter. 

$formIDs = XXXX->getFormIDs($project); //Which object should replace the XXXX? 
$formMapper = new Mapper\Form($db); 

foreach ($formIDs as $num=>$id) { 
    $form = new Entity\Form($id) 
    $formMapper->load($form); 
} 

私はそれをoverthinkingてるようそれはほとんど感じているが、私はちょうどPPRMapperでgetFormIDsを()入れに行くたび「違和感」のやっかいな感覚があります。私はこの方法をどこに置くかは本当に問題なのですか?明らかに論争の的になる性質にもかかわらず、このようなことを処理する別のヘルパークラスを作成する必要がありますか?

答えて

0

は、合意された - それは見て、間違って感じています。 Entity\ProjectsetFormsと呼ばれる方法があります。

私はこのようにそれを行います。あなたのマッパーの積載方法がEntity\Projectを移入どんなメカニズムを介して、それはまたEntity\ProjectのプロパティとしてEntity\FormCollectionの新しいインスタンスを作成し、そのインスタンスのsetProjectメソッドを呼び出します:つまり

を、プロジェクトのマッパーは、何かのように見える:

public function load(Entity\Project $project) 
{ 
    // map data 
    // populate $project through some method like $project->setParams($data) 
} 

その後Entity\ProjectsetParams方法:

public function setParams($params) 
{ 
    // call a bunch of $this->setters to populate instance 

    // create a FormCollection: 
    $forms = new Entity\FormCollection; 
    $forms->setProject($this) 

    $this->setForms( $forms); 
} 

フォームが関連付けられて取得するには収集パターンの詳細については読むhere

$project->setId(43); 
$projectMapper->load($project); 

$formCollection = $project->getForms(); 

$formCollectionMapper = new Mapper\FormCollection($db); 
$formCollectionMapper->load($formCollection); 

// now all your populated form instances can be accessed individually: 
// here I use a method `getAssoc()` but you can also create a custom iterator and 
// drop the method call 
foreach($formCollection->getAssoc() as $form) 
{ 
    $form; // instance of Entity\Form 
} 

:プロジェクト、FormCollectionマッパーは、作業を行います。また、おそらくthis postおよび/またはthis postが参考になります。

関連する問題