JMS Serializer ignores mappings for Knp Paginator

梦想的初衷 提交于 2019-12-04 11:24:13

问题


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

回答1:


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.




回答2:


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!