将业务逻辑实现到模型中

时间:2013-10-23 15:37:26

标签: php laravel tdd domain-driven-design

我对如何在域模型中实现某些业务逻辑感到困惑。 我正在使用带有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
  }

}

我的控制器调用模型程序中的函数update()。 我怎样才能实现这种情况,以便我的模型可以测试并遵循正确的模式?因为我不知道处理它的最佳方法是什么,并且在类注册类中调用函数generate()和在类Enrollments中调用close()。

非常感谢!

1 个答案:

答案 0 :(得分:0)

在PHPUnit中,您可以模拟受保护的方法或创建子类,这些子类将公开私有方法(如closeEnrollments()),从而允许您创建存根以进行测试 - 有关详细信息,请参阅http://phpunit.de/manual/3.7/en/test-doubles.html

但是我建议你改进你的架构并研究TDD,SOLID,洋葱架构等概念。这些只是DDD等高级概念的核心概念(及其组件,如Value对象,实体,存储库,服务和等等)。例如。在您的示例中,类Program提供持久性,验证,一些其他业务逻辑,并且同时是聚合根。做得太多的课程很难测试。此外,当业务需求发生变化时,此类很难改变,等等。