Zend framework2 Zend Apigility:删除HTTP方法验证
我最近探索了Apigility,我想使用HTTP DELETE方法删除一些实体,但在删除之前,我需要验证“entityId”必须给定,并且必须是数字和修剪。 问题在于文件中提到: 内容验证目前仅适用于POST、修补程序和PUT请求。如果需要验证查询字符串参数,则需要为这些任务编写自己的逻辑。 我在配置文件中做了一些自定义修改,如下所示:Zend framework2 Zend Apigility:删除HTTP方法验证,zend-framework2,laminas-api-tools,Zend Framework2,Laminas Api Tools,我最近探索了Apigility,我想使用HTTP DELETE方法删除一些实体,但在删除之前,我需要验证“entityId”必须给定,并且必须是数字和修剪。 问题在于文件中提到: 内容验证目前仅适用于POST、修补程序和PUT请求。如果需要验证查询字符串参数,则需要为这些任务编写自己的逻辑。 我在配置文件中做了一些自定义修改,如下所示: 'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Controller' => [ 'DELE
'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Controller' => [
'DELETE' => 'NetworkingNightAPI\\V1\\Rpc\\AssignTimeSlotToLoginUser\\Validator',
],
正如我提到的,用于验证的DELETE方法与NetworkingNightAPI\V1\Rpc\assigntimeslotologinuser\Validator相同,但问题是,即使我使用PostMan添加了有效的行JSON值,它也始终返回“Value不能为空”
谢谢 如果要删除资源,应使用包含指向该实体的路由的
url
。这意味着id
将位于路线参数中,而不是查询参数中。因此,id是一个路由参数/标识符,RestController
将使用资源侦听器的fetch($id)
方法中的标识符搜索实体。如果具有该标识符的实体不存在,侦听器应该返回not found(404)响应
您在问题中提到的内容验证用于验证POST/GET参数。因此,在删除请求的情况下,不需要这样的验证器
例如,假设您想要删除一个插槽
,您将拥有一条路由:
api/v1/slots/[slot_id]
如果您想删除id为1
的插槽
,您将向以下地址发送删除请求:
DELETE
api/v1/slots/1
如果不存在具有
Slot\u id
1
的Slot
时,您的侦听器应该简单地返回404响应。我看到您使用的是RPC而不是Rest样式-如果您使用查询字符串传递参数,您必须在控制器内部亲自验证它,例如:
public function someActionMethod()
{
$id = $this->getRequest()->getQuery('id');
$validator = new Input('id');
$validator->getValidatorChain()
->attach(new \Zend\Validator\NotEmpty())
;
$validator->getFilterChain()
->attach(new StringToUpper())
;
$inputFilter = new InputFilter();
$inputFilter
->add($validator)
->setData($this->getRequest()->getQuery())
;
if( ! $inputFilter->isValid()) {
return new \ZF\ApiProblem\ApiProblemResponse(
new ApiProblem(400, $inputFilter)
);
}
}
Apigility不会使用UI生成的任何配置为您验证通过查询字符串传递的字段(如文档中所述),它们将被忽略。您需要自己生成valaidator
如果愿意,您可以将其设置为使用配置生成验证,然后将验证程序加载到控制器中,以保存如上所述的编写锅炉板代码。谢谢您的回复 我发现Apigility使用“zf内容验证”模块验证输入数据() 此模块不限制此类HTTP方法,您可以像上面所说的那样对删除方法应用验证 在上面的示例中,将为修补、放置或删除请求选择Application\Controller\HelloWorld\Validator服务,而为POST请求选择Application\Controller\HelloWorld\CreationValidator服务 所以您只需要在配置文件中为DELETE方法添加手动条目,如下所示:
'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Controller' => [
'input_filter' => 'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Validator',
'DELETE' => 'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Validator',
],
此外,HTTP DELETE方法不会使用POSTMAN提供的JSON行正文进行验证。您必须传递查询参数,并且在控制器中,您需要使用如下插件获取验证数据:
$recruiterId = $this->getInputFilter()->getValues()['recruiterId'];
$timeSlotId = $this->getInputFilter()->getValues()['timeSlotId'];
当我将entityId作为查询字符串传递(如?entityId=1)时使用POSTMAN,那么它得到了验证,但当我在正文中传递行JSON时,它没有。我更喜欢验证配置文件中的数据。正如前面提到的那样,apigility不会为您加载数据,您仍然需要让验证器自己从配置中加载数据。