Apigility子路由没有得到父参数

时间:2014-07-01 00:28:50

标签: php zend-framework2 apigility

我试图为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',
                            ),
                        ),
                    )
                ),
            ),
        ),
    ),

1 个答案:

答案 0 :(得分: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',

实体很可能应该在数组中包含数据,并且该数组应该包含一个名为&#39;参数&#39;然后它会尝试获取该密钥的值。


在另一个metadata_map配置中,您可以设置一个“静态”数组。像这样的路线参数:

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

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

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

其中my_value可以是一个整数等字符串。

我希望这种见解对你有所帮助。我似乎完全没有看到它可能出错的地方。