Zend Apigility:DELETE HTTP方法验证

时间:2016-11-23 13:05:17

标签: zend-framework2 apigility

我最近探索过Apigility我想使用HTTP DELETE方法删除一些实体但在删除之前我需要验证“entityId”必须给出并且必须是Digit和trim。 问题是文档提到:

内容验证目前仅适用于POST,PATCH和PUT请求。如果需要验证查询字符串参数,则需要为这些任务编写自己的逻辑。 https://apigility.org/documentation/content-validation/intro 我在配置文件中做了一些客户修改,如下所示:

'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Controller' => [
  'DELETE' => 'NetworkingNightAPI\\V1\\Rpc\\AssignTimeSlotToLoginUser\\Validator',
        ],

正如我提到DELETE方法验证相同的NetworkingNightAPI \ V1 \ Rpc \ AssignTimeSlotToLoginUser \ Validator但问题是它总是返回'值不能为空'即使我使用PostMan添加了有效的行JSON值

谢谢!

3 个答案:

答案 0 :(得分:0)

如果要删除资源,则应使用包含该实体路由的url。这意味着id将在您的路由参数中,而不在您的查询参数中。因此id是路由参数/标识符,RestController将使用资源侦听器的fetch($id)方法中的标识符搜索您的实体。如果具有该标识符的实体不存在,则监听器应返回未找到的(404)响应。

您在问题中提到的内容验证用于验证POST / GET参数。因此,在删除请求的情况下不需要这样的验证器。

所以说例如你要删除一个Slot你有一条路线:

api/v1/slots/[slot_id]

如果您要删除ID为Slot的{​​{1}},则会向以下位置发送删除请求:

1

如果DELETE api/v1/slots/1 Slot slot_id不存在1,您的听众应该只返回404回复。

答案 1 :(得分:0)

我看到您使用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。

如果您愿意,可以将其设置为使用配置生成验证,然后在控制器内加载验证器以节省如上所述的写锅炉板代码。

答案 2 :(得分:0)

感谢您的回复

我发现的是Apigility使用&zf-content-validation'用于验证输入数据的模块( https://github.com/zfcampus/zf-content-validation

此模块不限制此类HTTP方法您可以将验证应用于DELETE方法,就像它说的那样

"在上面的示例中,将为PATCH,PUT或DELETE请求选择Application \ Controller \ HelloWorld \ Validator服务,而为POST请求选择Application \ Controller \ HelloWorld \ CreationValidator。&# 34;

所以你只需要在配置文件中添加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'];