2014-04-24 5 views
1

서비스/datamapper/domain 객체 트리오를 사용할 때 내 페이지 매김이 올바른 위치로 간주되는 것은 무엇입니까?데이터 마커, 서비스 및 도메인 객체 트리오를 사용할 때 페이지 매김은 어디에서 생깁니 까

예 :

  • 결과를 페이지 매김 몇 주어진 기준 포트를 가져 오기
  • 알고 우리에 어떤 페이지, 총 페이지 수,보기의 결과 등의 수 클래스

아래는 지금 여기에서 작성한 내용이지만 내 응용 프로그램과 유사합니다.

class PostController extends Controller 
{ 
    function viewPosts() 
    { 
     return $this->serviceFactory 
      ->build('post') 
      ->getPosts($aCriteria, $this->request->_get('page'), 10); 
    } 
} 

현재 각 서비스에서 페이지 매김 매개 변수를 계산하고 저장하고 있습니다. 내 컨트롤러에서 뷰에 어떤 데이터도 넣지는 않습니다.

class PostService extends AbstractService 
{ 
    public $posts; 

    public $iTotalPages; // This does not belong here does it? 

    function getPosts($aCriteria, $iPage, $iItemsPerPage) 
    { 
     $mapper = $this->dataMapperFactory->build('post'); 

     // I do not know where to put the below 
     // (The parameters and the code itself) 
     $iCount = $mapper->count($aCriteria); 
     $iOffset = $iItemsPerPage * $iPage; 
     $this->iTotalPages = $iCount/$iItemsPerPage; 

     $this->posts = $mapper->find($aCriteria, $iOffset, $iOffset + $iItemsPerPage); 

     return $this->posts; 
    } 
} 

내보기는 내가보기에서 $service->iTotalPages 부를 수있는, 내 컨트롤러와 모델 층의 동일한 인스턴스에 액세스 할 수 있지만 잘못 느낀다.

class PostsView extends AbstractView 
{ 
    function viewPosts() 
    { 
     $service = $this->serviceFactory->build('post'); 

     if(count($service->posts)>0) { 
      $this->template->assign_var('TOTAL_PAGES', $service->iTotalPages); 
      $this->template->assign_vars('POSTS', $service->posts);   
     } 
    } 
} 

솔루션?

1) 페이지 매김을위한 서비스를 만들고 필요에 따라 컨트롤러가 포스트 서비스와 데이터를 교환하게합니까?

2) 각 서비스에 포함 할 수있는 페이지 매김을위한 도우미 클래스를 만드시겠습니까? (그런 클래스는 어떻게 생겼을까요?)

3) AbstractService에 일반 페이지 매김을 추가 하시겠습니까?

4) 내 Repos에 일종의 페이지 매김 지원을 추가 하시겠습니까?

+0

데이터베이스 수준에서 페이지 매김이 필요한 경우 기준 및 페이지 매김을 읽기 리포지토리에 추가 할 수 있습니다. 개인적으로, 필자는 제일 처음에 max를 finder의 매개 변수로 사용하는 것을 선호한다. (나는 좀 더 일반적인 것으로 생각한다.) 전체 페이지, 현재 페이지 (대개 ui 용어)를 컨트롤러로 변환한다. – Hippoom

답변

1

몇 가지 제안이 있긴하지만 답은 매우 좋습니다.

레이어 위치 : 당신이 데이터를 검색하는 방법에 대한 낮은 수준의 제어 할 수 있도록

페이지 매김 인프라가 데이터 액세스 레이어에서 살아야한다,입니다.

최고 호출

페이지 매김의 추상화 인터페이스와 프런트 엔드 우려 때문에, UI 서비스를 통해 노출한다.

추상화 (난 당신이 이미 당신의 대답에 덮여 있다고 생각) : UI를 알아야

페이지 지수, 페이지 수, 페이지 당 항목 수, 총 항목입니다. 옵셋이나 한계가 아니라 캡슐화되어야하는 인프라 용어입니다.

입력 : (당신의 fitlers의 일부)

  1. 검색 필터
  2. 정렬 필터
  3. 페이지 인덱스 (필요한 경우).
  4. 페이지 당 항목 수. (다음이 캡슐화되어야없는 경우, UI가 제어 할 수있는 경우)

출력 :

  1. 필터링 컬렉션
  2. (네비게이션) 페이지 전체 항목
  3. 번호의 수 (만약 UI에 필요)
+0

유효한 포인트. 어쨌든 내 솔루션에 대한 몇 가지 추가 수정 작업을 수행해야합니다. 입력 내용이 제대로 적용될 것입니다. 업데이트하고 내 질문에 대한 답변을 잠깐 추가하겠습니다. – bblue

0

이 질문에 대한 답변이 없기 때문에 제가 생각해 낸 해결책을 게시하고 있습니다. 개선 할 수 있다면 의견/추가 사항을 감사하십시오. 그것을 내 컨트롤러 (나는 생각한다)에 비즈니스 로직을 누출하고 있지 않다이 방법을 수행

// Controller method 
public function viewPosts() 
{ 
    // Create service objects 
    $postService = $this->serviceFactory->build('post', true); 
    $searchService = $this->serviceFactory->build('search'); 

    // Set the search/filter parameters 
    $searchService->addFilter('author_id', $this->visitor->user_id); 
    $searchService->setOffset($this->request->_get('offset')); 
    $searchService->setLimit($this->request->_get('limit')); 

    // Search service will call the 'find' method on $articleService 
    $searchService->setServiceObject($articleService, 'find'); 

    // Search service will return a filtered collection 
    return $searchService->search(); 
} 

, 여전히 각각의 특정 서비스를 유지하면서 나는 내 모든 필터링 및 반환 된 SQL 데이터 분석을 할 수있는 하나의 클래스가 특정 find() 메서드 및 데이터 검색기를 제어합니다.