2017-11-02 2 views
0

다음 작업을 수행하려고합니다.Symfony 3 - 우려의 분리?

나는 "티켓"엔티티가 있으며 여기에는 여러 개의 티켓 엔티티가 있습니다. 각 Ticket에는 TicketStatus (다른 엔티티)가 있습니다.

이제 스프린트를 렌더링 할 때 스프린트의 진행 상황을 계산하려고합니다.

어디에서 어떻게해야합니까?

직관적으로 나는이 방법을 내 Sprint 엔터티 (getSprintProgress()와 같은 것)에 추가 할 것입니다.

그러나 그때 나는 당신이 관심사의 분리 때문에 당신의 실재물 종류에있는 db를 질문하고 싶지 않다 어디에나 읽고있다.

어떻게 하시겠습니까? 이상적으로 난 그냥 DB에 카운트() 쿼리를 실행할 것

...

답변

1

은이 문제에 대한 여러 가지 접근 방법이있다.

먼저 Sprint와 Ticket 엔티티 간의 일반적인 Doctrine 연결을 정의했다고 가정하면 Sprint :: getProgress()가 좋습니다. 티켓은 필요에 따라 게으르게로드됩니다. 이것은 실제로 이것과 같은 간단한 것을 시작하기에 좋은 곳입니다.

쿼리를 정의하고 티켓을로드하는 것으로 지연로드가 필요없고 성능이 조금 향상 될 수 있습니다. 조심하다면 티켓의 일부만 (상태 필드가 아마도)로드되도록 쿼리를 구체화 할 수 있습니다. 그리고 닫힌 티켓을 완전히로드하지 않는 것이 좋습니다.

다른 방법은 진행률 계산기를 자신의 클래스로 이동하는 것입니다. 따라서 SprintProgressCalculator :: calculate ($ sprint) 메서드를 사용할 수 있습니다. 서비스로 정의하고 데이터베이스 연결을 삽입하십시오. 렌더링을 위해 당신은 나뭇 가지 확장에 계산기를 삽입 할 수 있으며 자신의 나뭇 가지 기능을 만들 수 있습니다. 이것은 계산이 단순한 쿼리보다 복잡하다면 취할 수있는 접근 방식입니다.

마지막으로 ORM이 기본 CRUD 유형 응용 프로그램에 적합하다는 일반적인 관찰. 더 많은 비즈니스 지향적 인 작업에 참여하는 정도는 아닙니다. 따라서 계산기와 비즈니스 로직이 더 복잡하다면 단순한 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에 포함되어 있습니다. 분명히 ArrayCollection에는 filter라는 메서드가 있습니다.이 메서드를 사용하면 내가 원하는대로 수행 할 수있는 클로저를 정의 할 수 있습니다. 결국 필터() 메소드 here

외, I는 해당 프린트의 티켓의 총량 대 완료 티켓의 비율을 계산한다.

이 약 2 가지 궁금 날 떠나지 않습니다 그들은 지방 모델을 사용 Laravel, 슬림 컨트롤러 개념이에서 오는

  • 은 가장 "자연"을 느꼈다. 하지만 정말로?
  • 성능은 어떻습니까? $ this-> ticket은 모든 티켓을 모두로드합니까? 왜냐하면 나는 실제로 각 티켓에 첨부 된 상태에만 관심이 있기 때문입니다. (상태는 실제로 TicketStatus 엔티티 btw입니다).

이 문제에 대한 다른 의견을 듣고 싶습니다.

건배

+0

기본적으로 엔티티는 항상 완전히로드됩니다. 따라서 내 대답은 사용자 지정 쿼리를 작성하고 원하는 속성 만로드하는 것이 좋습니다. 그렇지만 엔티티가 정말로 복잡하지 않다면 스피드 향상에 주목해야합니다. 병목 현상이 발생했다는 것을 알고 있다면 최적화하는 것입니다. – Cerad

+0

피드백 Cerad에 감사드립니다. 답변으로 표시했습니다. 감사 – Guardian