1

ドメイン モデル内にビジネス ロジックを実装する方法について、少し混乱しています。私はLaravelフレームワークでphpを使用していますが、質問はフレームワークとは無関係です。

次のような状況があります。

  • プログラムを更新したら、それに関連するすべての登録を終了する必要があります。
  • 新しいリマークを生成します。

私のモデル プログラムには、次のような多くのコメントと登録があります。

ProgrammeController extendes Controller {

  public function update($id)
  {
    $programme = Programme::find($id);
    $programme->fill(Input::all());

    $programme->update();

    //Redirects .....
  }

}

Programme extends Eloquent {

  public function update()
  {
    if(!$this->valid()) 
        return false;

    $this->save();

    //Should close all enrollments
    $this->closeEnrollments($this->enrollments());

    //Should generate a new remark

  }

  private function closeEnrollments($enrollments)
  {
    foreach($enrollments as $enrollment)
    {
        $enrollment->close();
    }
  }

  public function enrollments()
  {
    return $this->hasMany('Enrollment');
  }

  public function remarks()
  {
    return $this->hasMany('Remark');
  }

}

Enrollment extends Eloquent {

  public function programme()
  {
    return $this->belongsTo('Programme');
  }

  public function close()
  {
    //do something
  }

}

Remark extends Eloquent {

  public function programme()
  {
    return $this->belongsTo('Programme');
  }

  public function generate()
  {
    //do something
  }

}

私のコントローラーは、モデル Programme で関数 update() を呼び出します。モデルをテスト可能にし、正しいパターンに従うことができるように、この状況をどのように実装できますか? それを処理し、クラス Remark で関数 generate() を呼び出し、クラス Enrollments で close() 関数を呼び出す最善の方法がわからないためです。

どうもありがとう!

4

1 に答える 1

0

PHPUnit では、保護されたメソッドをモックしたり、closeEnrollments() のようなプライベート メソッドを公開するサブクラスを作成したりできるため、テスト用のスタブを作成できます - http://phpunit.de/manual/3.7/en/test-doubles.htmlを参照してください多くのための。

ただし、アーキテクチャを改善し、TDD、SOLID、オニオン アーキテクチャなどの概念を検討することをお勧めします。これらは、DDD などのより高度な概念 (および値オブジェクト、エンティティ、リポジトリ、サービスなどのコンポーネント) のコア概念にすぎません。 . 例えば。あなたの例では、クラス Program は永続性、検証、その他のビジネスロジックを提供し、同時に集約ルートです。あまりにも多くのことを行うクラスは、テストが困難です。また、そのようなクラスは、ビジネス要件が変更された場合など、将来変更するのが困難です。

于 2013-10-24T22:09:35.327 に答える