我对如何在域模型中实现某些业务逻辑感到困惑。 我正在使用带有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()。
非常感谢!
答案 0 :(得分:0)
在PHPUnit中,您可以模拟受保护的方法或创建子类,这些子类将公开私有方法(如closeEnrollments()),从而允许您创建存根以进行测试 - 有关详细信息,请参阅http://phpunit.de/manual/3.7/en/test-doubles.html。
但是我建议你改进你的架构并研究TDD,SOLID,洋葱架构等概念。这些只是DDD等高级概念的核心概念(及其组件,如Value对象,实体,存储库,服务和等等)。例如。在您的示例中,类Program提供持久性,验证,一些其他业务逻辑,并且同时是聚合根。做得太多的课程很难测试。此外,当业务需求发生变化时,此类很难改变,等等。