我正在尝试为 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',
),
),
)
),
),
),
),
最佳答案
我对 Apigility 有一些经验,但对您的配置没有经验。
据我所知,这确实意味着 Hal 插件无法为您的名为 parameter 的 route_identifier 找到一个值,因此它无法呈现自链接。
在您的某些 metadata_map 配置中 (nr 1+2) 似乎应该从资源中获取值:
有一条路线,路线名称:
'route_name' => 'parent.rest.service',
为了正确呈现这条路线,我们需要一个名为参数的路线标识符:
'route_identifier_name' => 'parameter',
要获取此路由标识符的值,我们需要实体中名为 parameter 的属性:
'entity_identifier_name' => 'parameter',
很可能实体应该在一个数组中包含数据,并且该数组应该包含一个名为“parameter”的键,然后它会尝试获取与该键对应的值。
在另一个 metadata_map 配置中,您设置了一个“静态”路由参数数组,如下所示:
'route_params' => array('parameter'),
这是不完整的,因为您始终使用键和值设置路由参数数组。 所以这应该是这样的:
'route_params' => array('parameter' => 'my_value'),
其中 my_value 可以是字符串、整数等。
希望本文能对您有所帮助。我似乎完全看不出还有什么地方可能出错。
关于php - Apigility 子路由未获取父参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24500865/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el