Search code examples
jmsserializerbundleknppaginator

JMS Serializer ignores mappings for Knp Paginator


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"
}

Solution

  • 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.