2017-11-02 21 views
0

私は以下を達成しようとしています:Symfony 3 - 懸念の分離?

私は、いくつかのチケットエンティティを含む "Sprint"エンティティを持っています。 各TicketにはTicketStatus(別のエンティティ)があります。

今、スプリントをレンダリングするときに、スプリントの進行状況を計算したいと思います。

ここでどのようにすればいいですか?

直感的に私はこのメソッドをSprintエンティティ(getSprintProgress()など)に追加します。

しかし、私は懸念の分離のためにあなたのエンティティクラスのDBをクエリしたくないということはどこでも読んでいます。

どうやってこれをやりますか?理想的には、私はちょうどデシベルの数()クエリを実行します

...

答えて

1

は、この問題に対するいくつかの可能なアプローチがあります。

まず、SprintとTicketエンティティの間に従来のDoctrineの関連付けを定義していれば、Sprint :: getProgress()は問題ありません。チケットは必要に応じて遅延ロードされます。これは実際にはこれほど簡単なもののために始めるのに良い場所です。

クエリを定義してチケットを読み込むことで、遅延読み込みの必要性を避けることができます(そしておそらく少しのパフォーマンス改善が得られます)。注意深い場合は、チケットの必要な部分(おそらくステータスフィールド)だけがロードされるようにクエリを絞り込むことができます。おそらく、閉じたチケットを完全にロードすることは避けてください。

もう1つの方法は、進捗計算機を自分のクラスに移動することです。したがって、あなたはSprintProgressCalculator :: calculate($ sprint)メソッドを持っているかもしれません。それをサービスとして定義し、データベース接続を挿入します。レンダリングのためには、電卓の延長線に電卓を挿入して、自分の小枝機能を作ってください。これは、計算が単純なクエリより複雑である場合に取るべきアプローチの一種です。

最後に、基本的なCRUDタイプのアプリケーションでORMがうまく機能するという一般的な見解です。より多くのビジネス指向のオペレーションに関わるほどのことではありません。だから、もっと複雑な電卓やビジネスロジックがあれば、単純なSQLに戻すことを検討するかもしれません。

0

今のところ私はSprintエンティティでこれを実装しました。

public function getProgress() { 
    $tickets = $this->tickets; 
    $done_tickets = $tickets->filter(function(Ticket $ticket) { 
    return $ticket->getStatus()->getName() == 'Done'; 
    })->count(); 
return ($done_tickets/$tickets->count()) * 100; 

私がここに何をしたか明確にしましょう:

$this->tickets 

はArrayCollectionのが含まれています。どうやらArrayCollectionsにはfilterというメソッドがあり、私ができるようにクロージャを定義することができます。 端においてフィルタ()メソッドhere

の詳細、私はちょうどそのスプリントにチケットの総量対完了チケットのパーセンテージを計算します。

これは約2事を思って私を残しん:彼らは脂肪のモデルを使用しLaravel、スリムコントローラの概念、この方面から

  • は最も「自然」を感じました。しかしそれは本当ですか?
  • パフォーマンスについてはどうですか? $ this-> ticketはすべてのチケットを全部ロードしますか?私は実際には各チケットに付けられたステータスだけを気にするからです。 (ステータスは実際にはTicketStatusエンティティbtwです)。

この問題に関するその他の意見をお聞きしたい。

乾杯

+0

デフォルトでは、エンティティは常に完全に読み込まれます。したがって、私の答えでは、カスタムクエリを作成し、目的のプロパティのみを読み込むことを検討することをお勧めします。あなたのエンティティが本当に複雑でない限り、スピードの向上に気付くことは疑いありません。ボトルネックになっていることが分かっている場合は、最適化するだけのことです。 – Cerad

+0

フィードバックCeradに感謝します。それを答えにしました。感謝 – Guardian

関連する問題