1

我对如何在我的领域模型中实现一些业务逻辑有点困惑。我将 php 与 Laravel 框架一起使用,但问题与框架无关。

我有以下情况:

  • 当我更新程序时,我应该关闭所有与之相关的注册。
  • 生成新的备注。

我的模型程序有许多备注和注册如下:

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()。我怎样才能实现这种情况,以便我的模型可以测试并遵循正确的模式?因为我不知道处理它并在类 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 回答