Php Symfony restfull json分页

Php Symfony restfull json分页,php,json,symfony,pagination,restful-architecture,Php,Json,Symfony,Pagination,Restful Architecture,我需要创建带分页的api方法,并创建操作和服务,但我有响应: { "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&

我需要创建带分页的api方法,并创建操作和服务,但我有响应:

 {
 "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行,然后在标题中正确显示,但为什么不进行分页呢?我必须得到10行,但我有所有(100个项目)我创建了createQueryBuilder,如果我在$queryBuilder中调试,我有正确的参数(coutn 4->I have 4 project),但这个参数在分页中如何使用

  * 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';
}
}
class PaginatorService
{
公共函数构造(路由器$Router)
{
$this->router=$router;
}
公共功能已分页(
$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=新项目响应();
$dreamsResponse->setSelfPage($this->getSelfPage());
$dreamsResponse->setNextPage($this->getNextPage());
$dreamsResponse->setPrevPage($this->getPrevPage());
$dreamsResponse->setFirstPage($this->getFirstPage());
$dreamsResponse->setLastPage($this->getLastPage());
返回$dreamsResponse;
}
私有函数
{
返回(int)ceil($this->projectAll/(int)$this->count);
}
/**
*返回是否有下一页。
*
*@返回布尔值
*/
私有函数hasNextPage()
{
返回(int)$this->pages<$this->getNbPages();
}
/**
*返回页数。
*
*@返回整数
*/
私有函数getNbPages()
{
$nbPages=$this->calculateNbPages();
如果($nbPages==0){
返回$this->minimumNbPages();
}
返回$nbPages;
}
/**
*返回最小页数
*
*@return int
*/
私有函数minimumNbPages()
{
返回1;
}
私有函数getSelfPage()
{
返回$this->hasNextPage()?
$this->router->generate('get_projects'[
“计数”=>$this->count,
“页面”=>$this->pages,
“排序依据”=>$this->sortBy,
“排序顺序”=>$this->sortOrder,
]
) :
"假",;
}
私有函数getNextPage()
{
返回$this->hasNextPage()?
$this->router->generate('get_projects'[
“计数”=>$this->count,
“页面”=>$this->pages+1,
]
) :
"假",;
}
私有函数getPrevPage()
{
返回$this->hasNextPage()?
$this->router->generate('get_projects'[
“计数”=>$this->count,
'page'=>this->page-1,
]
) :
"假",;
}
私有函数getFirstPage()
{
返回$this->hasNextPage()?
$this->router->generate('get_projects'[
“计数”=>$this->count,
'page'=>this->minimumNbPages(),
]
) :
"假",;
}
私有函数getLastPage()
{
返回$this->hasNextPage()?
$this->router->generate('get_projects'[
“计数”=>$this->count,
'page'=>this->calculatenbages(),
]
) :
"假",;
}
}

我解决了这个问题,我需要创建queryBuilder并使用sort\u order sort\u by和count,然后在$projectResponse->setProjects($queryBuilder)中发布queryBuilder


我解决了这个问题,我需要创建queryBuilder并使用sort\u order sort\u by和count,然后在$projectResponse->setProjects($queryBuilder)中发布queryBuilder


因为你正在获取所有项目<代码>$projectAll=$repository->findAll()在这种情况下,要使输出与计数一样多?然后开始下一个计数如果我尝试get/projects.json?count=2&page=6&sort_by=createdAt&sort_order=ASCфцц我仍然得到所有项目,但我必须在第6页-id 11 id 12中得到2个项目。怎么做对了?我更新我的问题是因为你获取了所有的项目<代码>$projectAll=$repository->findAll()在这种情况下,要使输出与计数一样多?然后开始下一个计数如果我尝试get/projects.json?count=2&page=6&sort_by=createdAt&sort_order=ASCфцц我仍然得到所有项目,但我必须在第6页-id 11 id 12中得到2个项目。怎么做对了?我更新了我的问题
   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;
}