5

我正在尝试为 Apigility 服务编写子路由,并且在渲染_self链接之前一切正常。

GET http://host/api/service/parameter/gui/page

{
    "status": 500,
    "title": "Unexpected error",
    "describedBy": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html",
    "detail": "Missing parameter \"parameter\"",
    "details": {
        "code": 0,
        "message": "Missing parameter \"parameter\"",
        "trace": "#0 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/Segment.php(313): Zend\\Mvc\\Router\\Http\\Segment->buildPath(Array, Array, true, true, Array)\n#1 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/Segment.php(409): Zend\\Mvc\\Router\\Http\\Segment->buildPath(Array, Array, false, true, Array)\n#2 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/Part.php(197): Zend\\Mvc\\Router\\Http\\Segment->assemble(Array, Array)\n#3 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/TreeRouteStack.php(351): Zend\\Mvc\\Router\\Http\\Part->assemble(Array, Array)\n#4 /vagrant/vendor/zendframework/zendframework/library/Zend/View/Helper/Url.php(100): Zend\\Mvc\\Router\\Http\\TreeRouteStack->assemble(Array, Array)\n#5 [internal function]: Zend\\View\\Helper\\Url->__invoke('parent.rest.s...', Array, Array, true)\n#6 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(610): call_user_func(Object(Zend\\View\\Helper\\Url), 'parent.rest.s...', Array, Array, true)\n#7 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(634): ZF\\Hal\\Plugin\\Hal->fromLink(Object(ZF\\Hal\\Link\\Link))\n#8 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(667): ZF\\Hal\\Plugin\\Hal->fromLinkCollection(Object(ZF\\Hal\\Link\\LinkCollection))\n#9 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(525): ZF\\Hal\\Plugin\\Hal->fromResource(Object(ZF\\Hal\\Entity))\n#10 /vagrant/vendor/zfcampus/zf-hal/src/View/HalJsonRenderer.php(117): ZF\\Hal\\Plugin\\Hal->renderEntity(Object(ZF\\Hal\\Entity))\n#11 /vagrant/vendor/zendframework/zendframework/library/Zend/View/View.php(205): ZF\\Hal\\View\\HalJsonRenderer->render(Object(ZF\\Hal\\View\\HalJsonModel))\n#12 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/View/Http/DefaultRenderingStrategy.php(102): Zend\\View\\View->render(Object(ZF\\Hal\\View\\HalJsonModel))\n#13 [internal function]: Zend\\Mvc\\View\\Http\\DefaultRenderingStrategy->render(Object(Zend\\Mvc\\MvcEvent))\n#14 /vagrant/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend\\Mvc\\MvcEvent))\n#15 /vagrant/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend\\EventManager\\EventManager->triggerListeners('render', Object(Zend\\Mvc\\MvcEvent), Array)\n#16 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(352): Zend\\EventManager\\EventManager->trigger('render', Object(Zend\\Mvc\\MvcEvent))\n#17 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(327): Zend\\Mvc\\Application->completeRequest(Object(Zend\\Mvc\\MvcEvent))\n#18 /vagrant/public/index.php(38): Zend\\Mvc\\Application->run()\n#19 {main}"
    }
}

查看 ZF2 MVC 文档,我有点意识到我需要为我的参数设置一个 metadata_map 条目。但没有 Apigility 的示例。我读过硬编码不起作用,即便如此,这parameter是动态的,目前还不清楚如何正确调用module.config.php

'zf-hal' => array(
    'metadata_map' => array(
        'Parent\\V1\\Rest\\Service\\ServiceEntity' => array(
            'entity_identifier_name' => 'parameter',
            'route_name' => 'parent.rest.service',
            'route_identifier_name' => 'parameter',
            'hydrator' => 'Zend\\Stdlib\\Hydrator\\ObjectProperty',
        ),
        'Parent\\V1\\Rest\\Service\\ServiceCollection' => array(
            'entity_identifier_name' => 'parameter',
            'route_name' => 'parent.rest.service',
            'route_identifier_name' => 'parameter',
            'is_collection' => true,
        ),
        'Parent\\V1\\Rest\\Gui\\GuiEntity' => array(
            'entity_identifier_name' => 'page',
            'route_name' => 'parent.rest.service/gui',
            'route_identifier_name' => 'gui_page',
            'route_params' => array('parameter'),   #<------- unknown setting area, needs to get the parent route identifier somehow...
            'hydrator' => 'Zend\\Stdlib\\Hydrator\\ObjectProperty',
        ),
        'Parent\\V1\\Rest\\Gui\\GuiCollection' => array(
            'entity_identifier_name' => 'page',
            'route_name' => 'parent.rest.service/gui',
            'route_identifier_name' => 'gui_page',
            'route_params' => array('parameter'),
            'is_collection' => true,
        ),
    ),
),

编辑:添加路由器配置

 'router' => array(
        'routes' => array(
            'parent.rest.service' => array(
                'type' => 'Segment',
                'options' => array(
                    'route' => '/api/service[/:parameter]',
                    'defaults' => array(
                        'controller' => 'Parent\\V1\\Rest\\Service\\Controller',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'gui' => array(
                        'type' => 'Segment',
                        'options' => array(
                            'route' => '/gui[/:page]',
                            'defaults' => array(
                                'controller' => 'Parent\\V1\\Rest\\Gui\\Controller',
                            ),
                        ),
                    )
                ),
            ),
        ),
    ),
4

1 回答 1

1

我对 Apigility 有一些经验,但对你的配置没有。据我所知,这确实意味着 Hal-plugin 无法为您的route_identifier被调用者找到值parameter,因此它无法呈现自链接。

在您的某些metadata_map配置(nr 1 + 2)中,它似乎应该从资源中获取值:有一个带有路由名称的路由:

'route_name' => 'parent.rest.service',

为了正确渲染这条路线,我们需要一个名为的路线标识符parameter

'route_identifier_name' => 'parameter',

要获取此路由标识符的值,我们需要parameter从实体命名的属性:

'entity_identifier_name' => 'parameter',

实体很可能应该在一个数组中包含数据,并且该数组应该包含一个名为“参数”的键,然后它将尝试获取与该键一起使用的值。


在另一个metadata_map配置中,您设置了一个“静态”路由参数数组,如下所示:

'route_params' => array('parameter'),

这是不完整的,因为您始终使用键和值设置路由参数数组。所以这应该是这样的:

'route_params' => array('parameter' => 'my_value'),

哪里my_value可以是字符串,整数等。

我希望这个见解可以帮助你一点。我似乎没有完全看到它可能会出错的地方。

于 2014-07-03T07:50:11.943 回答