【问题标题】:Implementing business logic into models将业务逻辑实现到模型中
【发布时间】:2013-10-23 15:37:25
【问题描述】:

我对如何在我的领域模型中实现一些业务逻辑有点困惑。 我在 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()。 我怎样才能实现这种情况,以便我的模型可以测试并遵循正确的模式?因为我不知道处理它的最佳方法是什么,以及在 Remark 类中调用函数 generate() 和在 Enrollments 类中调用 close()。

非常感谢!

【问题讨论】:

  • $this->closeEnrollments($this->enrollments());对于这一行,您将传递一个查询对象。您可能想要传递一个包含注册的集合.. $this->closeEnrollments($this->enrollments);
  • 感谢肖恩的帮助。好的,在那一点我会改变......但是,要调用 Remark 的 generate() 函数,我应该在程序中创建一个新实例(或者这是一个反模式)?对不起,我的英语不好! ;)

标签: php laravel tdd domain-driven-design


【解决方案1】:

在 PHPUnit 中,您可以模拟受保护的方法或创建子类,这些方法会暴露诸如 closeEnrollments() 之类的私有方法,从而允许您创建用于测试的存根 - 请参阅 http://phpunit.de/manual/3.7/en/test-doubles.html 了解更多信息。

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

【讨论】:

  • 感谢一百万托马斯的帮助!我会看看你建议的概念,也许会考虑改进我的架构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2012-04-25
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多