如何将 knpPaginatorBundle 与 rest api 一起使用?
how to use knpPaginatorBundle with rest api?
我尝试使用
public 函数 listeleAction(请求 $request)
{
$em=$this->getDoctrine()->getManager();
$yasam_list=$em->getRepository("VanBundle:Yasam")->findAll();
if (count($yasam_list)>0)
{
$yanit=array();
foreach ($yasam_list as $meta)
{
$new_yasam=array();
$new_yasam['id']=$meta->getId();
$new_yasam['adi']=$meta->getAdi();
$new_yasam['adres']=$meta->getAdres();
$new_yasam['kategori_id']=$meta->getKategori()->getAdi();
array_push($yanit,$new_yasam);
}
$paginator=$this->get('knp_paginator');
$result= $paginator->paginate(
$yanit,
$request->query->getInt('page',1),
$request->query->getInt('limit',10)
);
}else{
$yanit["success"] = 0;
$response["message"] = "Bu kategoriye en kısa sürede veri eklenecektir. ";
}
$response=new Response(json_encode(array('yasamlar' =>$result),JSON_UNESCAPED_UNICODE));
$response->headers->set('Content-type','application/json; charset=utf-8');
$response->setStatusCode(200);
return $response;
}
我的json输出
{
"yasamlar": {}
}
我该如何解决这个问题?谢谢大家
在开始分页之前,一些建议:
- 将
KnpPaginatorBundle
与学说查询生成器一起使用。 运行 完整查询并根据结果进行分页无助于提高性能。
- 对于 REST API,您可以使用 FosRestBundle。只需很少的配置,您就不必执行
json_encode
、设置 Content-Type
或 Status Code
.
- 如果您不想使用FosRestBundle。探索并尝试在 return 中使用
JsonResponse
而不是 Response
.
现在,关于将 KnpPagination
信息传递给 API :
如果您正在使用 FosRestBundle,您可以使用 JMSSerializerBundle,这将帮助您将实体信息解析为 JSON
以获得 API 响应.您可以进一步选择要公开的属性。分页数据会自动解析。
否则,您只需遍历 KNPPaginator $result
对象,您从 doctrine query builder 中获取该对象,并将分页和数据分别发送到 JsonResponse
。
如果您需要代码片段,请告诉我。
希望对您有所帮助!
我解决了
public function indexAction(Request $request)
{
$em=$this->getDoctrine()->getManager();
//listelenecek bütün Yasam
$yasam_list=$em->getRepository("VanBundle:Yasam")->findAll();
$pager=$this->get('knp_paginator');
$paginated=$pager->paginate($yasam_list,$request->query->getInt('page',1), $request->query->getInt('limit',10));
$factory=new KnpPaginatorFactory();
$collection=$factory->createRepresentation($paginated,new Configuration\Route('yasamjson_index'),array());
$serializer = $this->get('jms_serializer');
$data = $serializer->serialize([
'meta' => $collection,
'data' => $paginated->getItems()
], 'json');
return new Response($data);
}
我尝试使用
public 函数 listeleAction(请求 $request) { $em=$this->getDoctrine()->getManager();
$yasam_list=$em->getRepository("VanBundle:Yasam")->findAll();
if (count($yasam_list)>0)
{
$yanit=array();
foreach ($yasam_list as $meta)
{
$new_yasam=array();
$new_yasam['id']=$meta->getId();
$new_yasam['adi']=$meta->getAdi();
$new_yasam['adres']=$meta->getAdres();
$new_yasam['kategori_id']=$meta->getKategori()->getAdi();
array_push($yanit,$new_yasam);
}
$paginator=$this->get('knp_paginator');
$result= $paginator->paginate(
$yanit,
$request->query->getInt('page',1),
$request->query->getInt('limit',10)
);
}else{
$yanit["success"] = 0;
$response["message"] = "Bu kategoriye en kısa sürede veri eklenecektir. ";
}
$response=new Response(json_encode(array('yasamlar' =>$result),JSON_UNESCAPED_UNICODE));
$response->headers->set('Content-type','application/json; charset=utf-8');
$response->setStatusCode(200);
return $response;
}
我的json输出
{
"yasamlar": {}
}
我该如何解决这个问题?谢谢大家
在开始分页之前,一些建议:
- 将
KnpPaginatorBundle
与学说查询生成器一起使用。 运行 完整查询并根据结果进行分页无助于提高性能。 - 对于 REST API,您可以使用 FosRestBundle。只需很少的配置,您就不必执行
json_encode
、设置Content-Type
或Status Code
. - 如果您不想使用FosRestBundle。探索并尝试在 return 中使用
JsonResponse
而不是Response
.
现在,关于将 KnpPagination
信息传递给 API :
如果您正在使用 FosRestBundle,您可以使用 JMSSerializerBundle,这将帮助您将实体信息解析为 JSON
以获得 API 响应.您可以进一步选择要公开的属性。分页数据会自动解析。
否则,您只需遍历 KNPPaginator $result
对象,您从 doctrine query builder 中获取该对象,并将分页和数据分别发送到 JsonResponse
。
如果您需要代码片段,请告诉我。
希望对您有所帮助!
我解决了
public function indexAction(Request $request)
{
$em=$this->getDoctrine()->getManager();
//listelenecek bütün Yasam
$yasam_list=$em->getRepository("VanBundle:Yasam")->findAll();
$pager=$this->get('knp_paginator');
$paginated=$pager->paginate($yasam_list,$request->query->getInt('page',1), $request->query->getInt('limit',10));
$factory=new KnpPaginatorFactory();
$collection=$factory->createRepresentation($paginated,new Configuration\Route('yasamjson_index'),array());
$serializer = $this->get('jms_serializer');
$data = $serializer->serialize([
'meta' => $collection,
'data' => $paginated->getItems()
], 'json');
return new Response($data);
}