2015-08-03 6 views
1

Мне нужно создать метод ИПН с нумерацией страниц и создать действие и обслуживание, но у меня есть ответ:Symfony restfull JSON пагинация

{ 
"self_page": "\\/app_dev.php\\/projects?count=10&page=1&sort_by=created&sort_order=DESC", 
"next_page": "\\/app_dev.php\\/projects?count=10&page=2", 
"prev_page": "\\/app_dev.php\\/projects?count=10&page=0", 
"first_page": "\\/app_dev.php\\/projects?count=10&page=1", 
"last_page": "\\/app_dev.php\\/projects?count=10&page=10", 
"projects": [ 
    { 

и все данные, у меня есть 100 строк в БД, то в заголовке отображается правильно, но почему не работает pagination Я должен получить 10 строк, но у меня есть все (100 проектов) Я создаю createQueryBuilder, и если я отлаживаю в $ queryBuilder, у меня есть правильный параметр (coutn 4 -> У меня есть 4 проекта), но как этот параметр используется в разбивке на страницы

* RestView() 
* 
* @QueryParam(name="status", strict=true, requirements="[a-z]+", description="status of project", nullable=true) 
* @QueryParam(name="count", requirements="\d+", default="10", description="Count project at one page") 
* @QueryParam(name="page", requirements="\d+", default="1", description="Number of page to be shown") 
* @QueryParam(name="sort_by", strict=true, requirements="^[a-zA-Z]+", default="created", description="Sort by", nullable=true) 
* @QueryParam(name="sort_order", strict=true, requirements="^[a-zA-Z]+", default="DESC", description="Sort order", nullable=true) 
* 
* @param ParamFetcher $paramFetcher 
* @return View 
* 
* @throws NotFoundHttpException when not exist 
*/ 
public function getProjectsAction(ParamFetcher $paramFetcher) 
{ 
    $manager = $this->getDoctrine()->getManager(); 

    $repository = $manager->getRepository('ArtelProfileBundle:Project'); 

     if (!$paramFetcher->get('status')) { 
     $queryBuilder = $repository->createQueryBuilder('project') 
      ->where('project.currentStatus != :identifier1','project.currentStatus != :identifier2') 
      ->setParameter('identifier1', 'fail') 
      ->setParameter('identifier2', 'rejected') 
      ->orderBy('project.'.$paramFetcher->get('sort_by'), $paramFetcher->get('sort_order')) 
      ->setFirstResult($paramFetcher->get('count') * ($paramFetcher->get('page') - 1)) 
      ->setMaxResults($paramFetcher->get('count')) 
      ->getQuery() 
      ->getResult() 
     ; 
    } else { 
     $queryBuilder = $repository->createQueryBuilder('project') 
      ->where('project.currentStatus = :identifier') 
      ->setParameter('identifier', $paramFetcher->get('status')) 
      ->orderBy('project.'.$paramFetcher->get('sort_by'), $paramFetcher->get('sort_order')) 
      ->setFirstResult($paramFetcher->get('count') * ($paramFetcher->get('page') - 1)) 
      ->setMaxResults($paramFetcher->get('count')) 
      ->getQuery() 
      ->getResult() 
     ; 
    } 

    $projectAll = $repository->findAll(); 
    $paginator = $this->get('paginator'); 

    $pagination = $paginator->getPaginated(
     $paramFetcher->get('count'), 
     $paramFetcher->get('page'), 
     $paramFetcher->get('sort_by'), 
     $paramFetcher->get('sort_order'), 
     $projectAll 
    ); 

    $projectResponse = new ProjectResponse(); 

    $projectResponse->setProjects($projectAll); 
    $projectResponse->setSelfPage($pagination->getSelfPage()); 
    $projectResponse->setNextPage($pagination->getNextPage()); 
    $projectResponse->setPrevPage($pagination->getPrevPage()); 
    $projectResponse->setFirstPage($pagination->getFirstPage()); 
    $projectResponse->setLastPage($pagination->getLastPage()); 

    return $projectResponse; 
} 

и создайте для разбивки на страницы:

class PaginatorService 
{ 
public function __construct(Router $router) 
{ 
    $this->router = $router; 
} 

public function getPaginated(
    $count, 
    $pages, 
    $sortBy, 
    $sortOrder, 
    $projectAll 
) { 
    $this->count = $count; 
    $this->pages = $pages; 
    $this->sortBy = $sortBy; 
    $this->sortOrder = $sortOrder; 
    $this->maxPerPage = 10; 
    $this->projectAll = count($projectAll); 

    $dreamsResponse = new ProjectResponse(); 

    $dreamsResponse->setSelfPage($this->getSelfPage()); 
    $dreamsResponse->setNextPage($this->getNextPage()); 
    $dreamsResponse->setPrevPage($this->getPrevPage()); 
    $dreamsResponse->setFirstPage($this->getFirstPage()); 
    $dreamsResponse->setLastPage($this->getLastPage()); 

    return $dreamsResponse; 
} 

private function calculateNbPages() 
{ 
    return (int) ceil($this->projectAll/(int) $this->count); 
} 

/** 
* Returns whether there is next page or not. 
* 
* @return Boolean 
*/ 
private function hasNextPage() 
{ 
    return (int) $this->pages < $this->getNbPages(); 
} 

/** 
* Returns the number of pages. 
* 
* @return integer 
*/ 
private function getNbPages() 
{ 
    $nbPages = $this->calculateNbPages(); 

    if ($nbPages == 0) { 
     return $this->minimumNbPages(); 
    } 

    return $nbPages; 
} 

/** 
* Return minimum number pages 
* 
* @return int 
*/ 
private function minimumNbPages() 
{ 
    return 1; 
} 

private function getSelfPage() 
{ 
    return $this->hasNextPage() ? 
     $this->router->generate('get_projects', [ 
       'count' => $this->count, 
       'page' => $this->pages, 
       'sort_by' => $this->sortBy, 
       'sort_order' => $this->sortOrder, 
      ] 
     ) : 
     'false'; 
} 

private function getNextPage() 
{ 
    return $this->hasNextPage() ? 
     $this->router->generate('get_projects', [ 
       'count' => $this->count, 
       'page' => $this->pages + 1, 
      ] 
     ) : 
     'false'; 
} 

private function getPrevPage() 
{ 
    return $this->hasNextPage() ? 
     $this->router->generate('get_projects', [ 
       'count' => $this->count, 
       'page' => $this->pages - 1, 
      ] 
     ) : 
     'false'; 
} 

private function getFirstPage() 
{ 
    return $this->hasNextPage() ? 
     $this->router->generate('get_projects', [ 
       'count' => $this->count, 
       'page' => $this->minimumNbPages(), 
      ] 
     ) : 
     'false'; 
} 

private function getLastPage() 
{ 
    return $this->hasNextPage() ? 
     $this->router->generate('get_projects', [ 
       'count' => $this->count, 
       'page' => $this->calculateNbPages(), 
      ] 
     ) : 
     'false'; 
} 
} 
+1

Потому что вы выбираете все проекты? '$ projectAll = $ repository-> findAll();' –

+0

в этом случае сделать вывод так же, как и в count? и начните следующий подсчет –

+0

, если я попробую получить /projects.json?count=2&page=6&sort_by=createdAt&sort_order=ASC фтв все еще я получаю все проекты, но я должен получить 2 проекта на странице 6 - id 11 id 12. Как все правильно? –

ответ

0

Я решил эту проблему, нужно создать QueryBuilder и использовать SORT_ORDER sort_by и сосчитать, а затем я отправляю QueryBuilder в $ projectResponse-> setProjects ($ QueryBuilder);

public function getProjectsAction(ParamFetcher $paramFetcher) 
{ 
    $manager = $this->getDoctrine()->getManager(); 

    $repository = $manager->getRepository('ArtelProfileBundle:Project'); 

    if (!$paramFetcher->get('status')) { 
     $queryBuilder = $repository->createQueryBuilder('project') 
      ->where('project.currentStatus != :identifier1','project.currentStatus != :identifier2') 
      ->setParameter('identifier1', 'fail') 
      ->setParameter('identifier2', 'rejected') 
      ->orderBy('project.'.$paramFetcher->get('sort_by'), $paramFetcher->get('sort_order')) 
      ->setFirstResult($paramFetcher->get('count') * ($paramFetcher->get('page') - 1)) 
      ->setMaxResults($paramFetcher->get('count')) 
      ->getQuery() 
      ->getResult() 
     ; 
    } else { 
     $queryBuilder = $repository->createQueryBuilder('project') 
      ->where('project.currentStatus = :identifier') 
      ->setParameter('identifier', $paramFetcher->get('status')) 
      ->orderBy('project.'.$paramFetcher->get('sort_by'), $paramFetcher->get('sort_order')) 
      ->setFirstResult($paramFetcher->get('count') * ($paramFetcher->get('page') - 1)) 
      ->setMaxResults($paramFetcher->get('count')) 
      ->getQuery() 
      ->getResult() 
     ; 
    } 

    $projectAll = $repository->findAll(); 

    $paginator = $this->get('paginator'); 

    $pagination = $paginator->getPaginated(
     $paramFetcher->get('count'), 
     $paramFetcher->get('page'), 
     $paramFetcher->get('sort_by'), 
     $paramFetcher->get('sort_order'), 
     $projectAll 
    ); 

    $projectResponse = new ProjectResponse(); 

    $projectResponse->setProjects($queryBuilder); 
    $projectResponse->setSelfPage($pagination->getSelfPage()); 
    $projectResponse->setNextPage($pagination->getNextPage()); 
    $projectResponse->setPrevPage($pagination->getPrevPage()); 
    $projectResponse->setFirstPage($pagination->getFirstPage()); 
    $projectResponse->setLastPage($pagination->getLastPage()); 

    return $projectResponse; 
}