Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 Zend Apigility:删除HTTP方法验证_Zend Framework2_Laminas Api Tools - Fatal编程技术网

Zend framework2 Zend Apigility:删除HTTP方法验证

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

我最近探索了Apigility,我想使用HTTP DELETE方法删除一些实体,但在删除之前,我需要验证“entityId”必须给定,并且必须是数字和修剪。 问题在于文件中提到:

内容验证目前仅适用于POST、修补程序和PUT请求。如果需要验证查询字符串参数,则需要为这些任务编写自己的逻辑。 我在配置文件中做了一些自定义修改,如下所示:

'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不会为您加载数据,您仍然需要让验证器自己从配置中加载数据。