I have problem with exclusion of some KNP Paginator properties with JMS Serializer.
First, this is included in composer.json
...
"jms/serializer-bundle": "~0.13",
"knplabs/knp-paginator-bundle": "2.4.*@dev",
...
I'm paginating CrmContacts entity and exclusion policy for that entity works well. I also added yml file for KNP Paginator like this:
config.yml
jms_serializer:
metadata:
directories:
KNPPB:
namespace_prefix: 'Knp\\Bundle\\PaginatorBundle'
path: %kernel.root_dir%/Resources/serializer/Knp
inside app/Resources/serializer/Knp folder I've created Pagination.SlidingPagination.yml:
Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination:
exclusion_policy: ALL
properties:
items:
expose: true
access_type: public_method
accessor:
getter: getItems
type: array
serialized_name:
payload
currentPageNumber:
expose: true
serialized_name:
page
numItemsPerPage:
expose: true
serialized_name:
items
totalCount:
expose: true
serialized_name:
totalItems
and this is logic for returning serialized data:
public function getContactsAction(Request $request)
{
$limit = $request->query->getInt('l', 10);
$page = $request->query->getInt('p', 1);
$serializer = $this->get('jms_serializer');
$contacts = $this->getDoctrine()
->getManager()
->getRepository('AcmeContactsBundle:CrmContact')
->getContacts();
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$contacts,
$page,
$limit
);
return new Response(
$serializer->serialize(
$pagination,
'json',
SerializationContext::create()->setGroups(['Default'])
),
Response::HTTP_OK,
[
'Content-Type' => 'application/json',
]
);
}
Unfortunately, I'm getting all properties from Knp Paginator in response:
{
"currentPageNumber": 1,
"numItemsPerPage": 10,
"items": [
{
"id": 1,
...
},
{
"id": 2,
...
},
{
"id": 3,
...
}
],
"totalCount": 3,
"paginatorOptions": {
"pageParameterName": "page",
"sortFieldParameterName": "sort",
"sortDirectionParameterName": "direction",
"filterFieldParameterName": "filterField",
"filterValueParameterName": "filterValue",
"distinct": true
},
"customParameters": [],
"route": "acmeContactsGetContacts",
"params": [],
"pageRange": 5,
"template": "KnpPaginatorBundle:Pagination:sliding.html.twig",
"sortableTemplate": "KnpPaginatorBundle:Pagination:sortable_link.html.twig",
"filtrationTemplate": "KnpPaginatorBundle:Pagination:filtration.html.twig"
}
The properties that you want to map are owned by Knp\Component\Pager\Pagination\AbstractPagination.
You also want to hide the rest of properties, so you will have to configure both classes.
I've just tried the following and it's working for me.
app/config/config.yml
jms_serializer:
metadata:
directories:
KnpPaginatorBundle:
namespace_prefix: Knp\Bundle\PaginatorBundle
path: %kernel.root_dir%/config/serializer/KnpPaginatorBundle
KnpPager:
namespace_prefix: Knp\Component\Pager
path: %kernel.root_dir%/config/serializer/KnpPager
app/config/serializer/KnpPager/Pagination.AbstractPagination.yml
Knp\Component\Pager\Pagination\AbstractPagination:
exclusion_policy: ALL
properties:
items:
expose: true
access_type: public_method
accessor:
getter: getItems
type: array
serialized_name:
payload
currentPageNumber:
expose: true
serialized_name:
page
numItemsPerPage:
expose: true
serialized_name:
items
totalCount:
expose: true
serialized_name:
totalItems
app/config/serializer/KnpPaginatorBundle/Pagination.SlidingPagination.yml
Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination:
exclusion_policy: ALL
Don't forget to clear the cache before testing.
Hope this helps you.
Instead of serializing all the pagination object, try to serialize only the data and items, like this:
$result = array(
'data' => $pagination->getItems(),
'meta' => $pagination->getPaginationData());
return new Response(
$serializer->serialize(
$result,
'json',
SerializationContext::create()->setGroups(['Default'])
),
Response::HTTP_OK,
['Content-Type' => 'application/json',]
);
来源:https://stackoverflow.com/questions/27214339/jms-serializer-ignores-mappings-for-knp-paginator