2013-10-23 131 views
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 
    } 

}

我的控制器調用模型程序中的函數update()。 我怎麼能實現這種情況,以便我的模型可以測試並遵循正確的模式?因爲我不知道什麼是最好的方式來處理它,並調用類Remark中的generate()函數和類Enrollments中的close()。

非常感謝!

+0

$ this-> closeEnrollments($ this-> enrollments()); 對於這一行,您傳遞了一個查詢對象。您可能想要傳遞包含註冊的集合.. $ this-> closeEnrollments($ this-> enrollments); –

+0

謝謝Shawn的幫助。 好吧,在這一點上,我會改變... 但是,要調用備註的generate()函數,我應該在程序內創建一個新實例(或者這是一個反模式)? 對不起我的英文不好! ;) – viniciusmr3

回答

0

在PHPUnit中,您可以模擬受保護的方法或創建將公開諸如closeEnrollments()之類的私有方法的子類,從而允許您創建測試的存根 - 有關更多信息,請參見http://phpunit.de/manual/3.7/en/test-doubles.html

但是我建議你改進你的架構,並研究像TDD,SOLID,洋蔥體系結構等概念。這些只是像DDD這樣的高級概念的核心概念(及其像Value對象,實體,存儲庫,服務等等)。例如。在你的例子中,類程序提供了持久性,驗證和其他一些業務邏輯,同時也是一個聚合根。太多的課程很難測試。此外,當業務需求變化等時,這樣的類別很難在將來改變。

+0

感謝百萬Tomas的幫助!我會看看你建議的概念,也許想想改善我的架構。 – viniciusmr3