【问题标题】:JMS Serializer ignores mappings for Knp PaginatorJMS Serializer 忽略 Knp Paginator 的映射
【发布时间】:2015-01-28 15:05:37
【问题描述】:

我在使用 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"
}

【问题讨论】:

    标签: jmsserializerbundle knppaginator


    【解决方案1】:

    您要映射的属性归 Knp\Component\Pager\Pagination\AbstractPagination 所有。

    您还想隐藏其余属性,因此您必须配置这两个类。

    我刚刚尝试了以下方法,它对我有用。


    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
    

    不要忘记在测试前清除缓存。

    希望对你有所帮助。

    【讨论】:

      【解决方案2】:

      不要序列化所有的分页对象,而是尝试只序列化数据和项目,像这样:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-26
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        相关资源
        最近更新 更多