我一直在考虑一种处理对灵活资源的 POST 请求中的嵌套/复杂值的好方法。
例如,在用于创建订单的单个 POST 请求中,订单可能包含订单商品的集合。 order 和 order-item 都作为资源存在。但是,我非常希望只有一个请求可以创建订单和订单项实体。在资源中处理它不是问题,但我想知道您将如何使用 apigiliy UI 配置该资源(我们称之为订单)——或者,如果根本不可能,使用配置。应用验证器和过滤器是 apigility 的关键特性之一,我想继续使用它,即使是对于复杂的请求数据。
在您提问之前,不应该使用下划线分隔值范围,例如 order_comment 和 order_item_comment。
有什么想法吗?:)
添加:示例 json 请求负载可能如下所示:
{
"created_at": "2000-01-01",
"amount" : "5000.00",
"address" : {
"name": "some name",
"street": "some street"
...
},
"items" : [
{"productId":99,"qty":1}
...
]
}
最佳答案
从 Wilt 的回答开始,我发现以下代码也能正常工作:
# file path: /module/MyApi/config/module.config.php
// some other stuff
'MyApi\\V1\\Rest\\MyRestService\\Validator' => array(
'address' => array(
0 => array(
'name' => 'name',
'required' => true,
'filters' => array(),
'validators' => array(),
),
1 => array(
'name' => 'street',
'required' => true,
'filters' => array(),
'validators' => array(),
),
'type' => 'Zend\InputFilter\InputFilter'
),
'amount' => array(
'name' => 'amount',
'required' => true,
'filters' => array(),
'validators' => array()
)
我遇到的唯一问题是当 address
作为字段(字符串或数字)而不是数组或对象传递时。在这种情况下,Apigility 抛出异常:
Zend\InputFilter\Exception\InvalidArgumentException: Zend\InputFilter\BaseInputFilter::setData expects an array or Traversable argument; received string in /var/www/api/vendor/zendframework/zendframework/library/Zend/InputFilter/BaseInputFilter.php on line 175
添加 address
作为一个更简单的(必需的)字段可以避免异常,但是无论我们将 address
作为 的数组传递,Apigility 都看不到任何区别>name
和 street
或虚拟字符串。
关于php - POST 请求中的嵌套参数/值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27297266/