【问题标题】:How to access URI query parameters from a Resource class using Apigility?如何使用 Apigility 从资源类访问 URI 查询参数?
【发布时间】:2015-02-16 17:04:10
【问题描述】:

我正在基于Zend Framework 2 开发一个Apigility 驱动的应用程序。

我希望我的应用程序同时为单个项目和列表提供嵌套响应:

/projects/1

{
    "id": "1",
    "title": "...",
    ...
    "_embedded": {
        "images": [
            {
                "id": "1",
                "project_id": "1",
                "title": "...",
                ...
            },
            {
                "id": "2",
                "project_id": "1",
                "title": "...",
                ...
            }
        ]
    },
    ...
}

/projects

{
    ...
    "_embedded": {
        "projects": [
            {
                "id": "1",
                "title": "...",
                ...
                "_embedded": {
                    "images": [
                        {
                            "id": "1",
                            "project_id": "1",
                            "title": "...",
                            ...
                        },
                        ...
                    ]
                },
                ...
            },
            ...
        ]
    },
    "total_items": 2
}

因为我还没有找到一个符合 apigility 的解决方案来实现具有嵌套列表的列表(在这种情况下,项目具有每个项目列表项的图像列表,请参阅 here)。我必须处理PaginatorDbAdapter 并手动提供page 参数:

class ProjectResource extends AbstractResourceListener {
    ...
    public function fetchAll($params = array()) {
        $pageNumber = $this->getEvent()->getRouteMatch()->getParam('page', 1); <-- that doesn't work
        $projectService = $this->getProjectService();
        $offset = $pageNumber > 0 ? $pageNumber - 1 : 0;
        $config = $this->getServiceManager()->get('Config');
        $itemCountPerPage = $config['zf-rest']['Portfolio\\V2\\Rest\\Project\\Controller']['page_size'];
        $projects = $projectService->getProjects($offset, $itemCountPerPage);
        return $projects;
    }
    ...
}

问题是,$this-&gt;getEvent()-&gt;getRouteMatch()-&gt;getParam('page', 1) 不起作用。不是page 参数,而是$this-&gt;getEvent()-&gt;getRouteMatch()-&gt;getParams() 返回

Array
(
    [controller] => Portfolio\V2\Rest\Project\Controller
    [version] => 2
)

如何访问请求参数?

【问题讨论】:

    标签: zend-framework2 http-request-parameters laminas-api-tools


    【解决方案1】:

    必须首先将请求参数添加到白名单中。它可以通过 Apigility GUI 或直接在配置中完成:

    module.config.php

    return array(
        ...
        'zf-rest' => array(
            ...
            'Portfolio\\V2\\Rest\\Project\\Controller' => array(
                ...
                'collection_query_whitelist' => array('page'),
                ...
            ),
            ...
        ),
    );
    

    然后可以通过Resource类的端点方法的参数访问参数:

    public function fetchAll($params = array()) {
        $projectService = $this->getProjectService();
        $config = $this->getServiceManager()->get('Config');
        $itemCountPerPage = $config['zf-rest']['Portfolio\\V2\\Rest\\Project\\Controller']['page_size'];
        $pageNumber = isset($params['page']) && intval($params['page']) > 0
            ? $params['page']
            : 1
        ;
        $offset = ($pageNumber - 1) * $itemCountPerPage;
        $projects = $projectService->getProjects($offset, $itemCountPerPage);
        return $projects;
    }
    

    另请参阅 Apigility 文档:ZF REST-&gt; Configuration -&gt; User Configuration -&gt; collection_query_whitelist

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多