11

JMS シリアライザーで一部の KNP ページネーター プロパティを除外することに問題があります。

まず、これは composer.json に含まれています

...
"jms/serializer-bundle": "~0.13",
"knplabs/knp-paginator-bundle": "2.4.*@dev",
...

私は CrmContacts エンティティをページ付けしており、そのエンティティの除外ポリシーはうまく機能しています。KNP Paginator の yml ファイルも次のように追加しました。

config.yml

jms_serializer:
    metadata:
        directories:
            KNPPB:
                namespace_prefix: 'Knp\\Bundle\\PaginatorBundle'
                path: %kernel.root_dir%/Resources/serializer/Knp

app/Resources/serializer/Knp フォルダー内に 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

これは、シリアル化されたデータを返すためのロジックです。

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',
        ]
    );

}

残念ながら、応答として Knp Paginator からすべてのプロパティを取得しています。

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

2 に答える 2

20

マップするプロパティは、Knp\Component\Pager\Pagination\AbstractPagination によって所有されています。

残りのプロパティも非表示にする必要があるため、両方のクラスを構成する必要があります。

私はちょうど次のことを試しましたが、それは私のために働いています。


アプリ/設定/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

テストの前にキャッシュをクリアすることを忘れないでください。

これがお役に立てば幸いです。

于 2015-01-14T03:58:50.333 に答える
4

すべてのページネーション オブジェクトをシリアル化する代わりに、次のようにデータとアイテムのみをシリアル化してみてください。

$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',]
);
于 2015-08-16T05:28:47.937 に答える