Laravel和模型上的逻辑执行

时间:2015-02-03 14:43:14

标签: php laravel laravel-4 solid-principles

我试图在我的应用中采用SOLID原则。

说我有这两个型号:

客户(字段= idnameaddress等) hasMany

馆藏(字段= idclient_idtickerholding_datevalue

在我的ClientsController中,我可能有这样的方法:

public function show($id)
{
 $client = Client::find($id);
 $client->setValuations();
 $valuations = $client->getValuations();    

 return View::make('clients.show')-with(compact('client', 'valuations'));
}

所以在控制器中我希望随着时间的推移获得客户的估值。我的客户端模型上的setValuations()执行相当复杂的查询,该查询对客户端的所有权进行求和,并将resulant集合设置为客户端上的属性。

所以我的客户端模型看起来有点像:

class Client extends \Eloquent {

 // All the usual model stuff

 protected $valuations;

 public function setValuations()
 {
  $this->valuations = DB::table('holdings')
        ->select('holdings.holding_date', DB::raw('SUM(holdings.value) AS sumofvalue') )
        ->where('holdings.client_id', $this->id)
        ->where('holdings.holding_date', DB::raw('LAST_DAY(holdings.holding_date)') )
        ->groupBy('holdings.holding_date')
        ->orderBy('holdings.holding_date', 'asc')
        ->get();
        return $this;
 }

 public function getValuations()
 {
  return $this->valuations;
 }
}

正如我们所看到的,这是一个相当数量的废话放入一个模型(为了简洁起见,我已经将它浓缩了很多!)。我认为使用存储库模式可能是最好的方法,但我不确定如何构建它。假设我有几个与客户端相关的属性,需要大量的查询或处理来确定它们是什么(例如返回客户货币的交易 - 这需要申请例如,fx转换为值的集合,如何构造它以及逻辑放在何处是最佳方式?

1 个答案:

答案 0 :(得分:0)

你是对的。保持这样的逻辑会使模型膨胀并导致违反SOLID原则。我使用存储库模式将这种逻辑移出我的模型(谁不应该有这个责任,即单一责任原则),并进入一个专门的类。

我建议你看一下像Laravel.io这样利用存储库模式的开源项目。看到他们的代码后,您应该能够自己应用该模式。这是一个链接https://github.com/LaravelIO/laravel.io

我也强烈推荐https://www.laracasts.com。详细讨论了SOLID原则和存储库模式,大大提高了我对Laravel和编码最佳实践的理解。