我一直在考虑一种处理对apigility资源的POST请求中的嵌套/复杂值的好方法。
例如,订单可能包含请求的单个POST中的订单商品集合,用于创建订单。订单和订单商品都作为资源存在。但是,我非常希望只有一个请求可以创建订单和订单商品实体。处理资源中的问题不是问题,但我想知道如何使用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}
...
]
}
答案 0 :(得分:2)
如果您正在使用ContentValidation
模块,则可以通过将嵌套资源分配给变量来为嵌套资源配置输入过滤器。然后你必须添加一个类型键(必不可少,否则重用过滤器将无法工作)。现在,您可以在input_filter_specs
中使用此变量,并且可以在另一个过滤器中重用整个过滤器。在config.php
:
<?php
namespace Application;
// Your address config as if it was used independently
$addressInputFilter => array(
'name' => array(
'name' => 'name',
'required' => true,
'filters' => array(
//...
)
'validators' => array(
//...
)
),
'street' => array(
'name' => 'street',
'required' => true,
'filters' => array(
//...
)
'validators' => array(
//...
)
),
// 'type' key necessary for reusing this input filter in other configs
'type' => 'Zend\InputFilter\InputFilter'
),
'input_filter_specs' => array(
// The key for your address if you also want to be able to use it independently
'Application\InputFilter\Address'=> $addressInputFilter,
// The key and config for your other resource containing a nested address
'Application\InputFilter\ItemContainingAddress'=> array(
'address' => $addressInputFilter,
'amount' => array(
'name' => 'amount',
'required' => true,
'filters' => array(
//...
),
'validators' => array(
//...
)
)
//... your other fields
)
)
答案 1 :(得分:2)
从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需要数组或Traversable参数;在第175行的/var/www/api/vendor/zendframework/zendframework/library/Zend/InputFilter/BaseInputFilter.php中收到字符串
添加address
作为进一步的简单(必填)字段可以避免异常,但是Apigility看不出我们是否将address
作为name
的数组传递并且没有任何区别street
或虚拟字符串。