我试图为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',
),
),
)
),
),
),
),
答案 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
可以是一个整数等字符串。
我希望这种见解对你有所帮助。我似乎完全没有看到它可能出错的地方。