【问题标题】:Api Platform pagination custom page_parameter_nameApi 平台分页自定义 page_parameter_name
【发布时间】:2020-12-11 19:54:58
【问题描述】:

我有一个非常具体的问题,我找不到为 Api 平台提供的任何答案和/或解决方案。 默认情况下,文档指出,如果要为分页操作传递页面参数,则必须执行以下操作:

pagination:
        page_parameter_name: _page

但是,由于我们前端的性质,我们无法将此变量传递给请求。它被硬编码到前端请求中,类似于page[number]=1

是否可以配置 page_parameter_name 来接收这个变量,或者我们需要在 Api 本身中以某种方式对其进行转换?

谢谢!

【问题讨论】:

    标签: react-admin api-platform.com


    【解决方案1】:

    ApiPlatform\Core\EventListener\ReadListener::onKernelRequest 通过 ApiPlatform\Core\Util\RequestParser::parseRequestParams 从请求中获取 $context['filters'] 最终使用 PHP 的 parse_str 函数,因此 'page[number]' 的值将在$context$context['filters']['page']['number'].

    ApiPlatform\Core\DataProvider\Pagination::getPage 从 $context['filters'][$parameterName] 检索页码,因此无论 [$parameterName] 的值如何,它最多只能检索数组 ['number'=> 1]。

    然后 ::getPage 将其转换为 int,它恰好是 1。但是(至少在 PHP7 中)对于“数字”下的任何值都是 1。

    结论:您需要在 Api 本身中以某种方式对其进行转换。例如通过 ApiPlatform\Core\DataProvider\Pagination 服务 (api_platform.pagination) 的decoration

    【讨论】:

      【解决方案2】:

      API_URL?page[number]=2

      print_r($request->attributes->get('_api_pagination'));
      Array(
          [number] => 2
      )
      

      “page_parameter_name”参数的值应该是“number”。

      api_platform.yaml

      collection:
          pagination:
             page_parameter_name: number
      

      这可能不适用于版本 3

      vendor/api-platform/core/src/JsonApi/EventListener/TransformPaginationParametersListener.php

      public function onKernelRequest(RequestEvent $event): void
      {
        $request = $event->getRequest();
        $pageParameter = $request->query->all()['page'] ?? null;
        ...
        /* @TODO remove the `_api_pagination` attribute in 3.0 */
        $request->attributes->set('_api_pagination', $pageParameter);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-22
        • 1970-01-01
        • 2016-10-04
        • 2017-06-03
        相关资源
        最近更新 更多