Php 即使在操作成功后,Apigility返回错误

Php 即使在操作成功后,Apigility返回错误,php,mysql,api,rest,zend-framework2,Php,Mysql,Api,Rest,Zend Framework2,我正在使用Apigility和Zend Framework 2构建RESTAPI。 在这个API中,我有一个代码连接的REST服务,当我试图删除一个实体时,我遇到了一个奇怪的行为。 我使用TableGateway对象的delete方法删除传递到“资源”文件的delete方法中的数据: 我使用Postman REST客户端测试了此函数,并得到了响应: { "type":"http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html",

我正在使用Apigility和Zend Framework 2构建RESTAPI。 在这个API中,我有一个代码连接的REST服务,当我试图删除一个实体时,我遇到了一个奇怪的行为。 我使用TableGateway对象的delete方法删除传递到“资源”文件的delete方法中的数据:

我使用Postman REST客户端测试了此函数,并得到了响应:

{
    "type":"http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html",
    "title":"Unprocessable Entity",
    "status":422,
    "detail":"Unable to delete entity."
}
但是,当我检查mysql数据库时,相关实体被正确删除。 没有发生错误的迹象

返回此类错误的原因可能是什么

更新: 代码到达TableGateway delete函数调用后的行。
这意味着响应可能是在调用函数后生成的,返回值I return被忽略。

如果将删除逻辑修改为“return true”,则API响应应按预期呈现HTTP 204

...
class ItemResource extends AbstractResourceListener
{
    ...
    public function delete($id)
    {
        $service = $this->serviceManager->get('...\ItemService');
        $service->deleteItem($id);
        return true;
    }
    ...
}

您的错误不在执行删除过程中。。但在错误的回应中,你会返回


删除之后,您需要考虑如何在格式良好(可能是基于JSON的)响应对象中正确地确认这一点。

我知道这已经有几年了,但我自己也遇到了这个问题。虽然我没有解决方案,但我确实相信我已经隔离了实际问题,而不是您的响应对象。通过使用断点,我可以看到ZF2为每个API delete调用触发两次delete事件


第一次通过时,一切正常,您删除了数据,但随后再次调用所有数据,导致“无法删除此实体”,因为该实体已不存在

但是Apigility已经将每个返回的数组或对象转换为基于JSON的响应对象。。您将得到一个无法处理的实体错误。相信我,我也得到了。。这是因为我从一个资源类返回的内容与我在配置中指定的实体类不匹配。我返回了无数与配置的实体类不匹配的实体,并且它工作正常。不管怎样,如果我从delete函数返回true或false,它就会工作。我真的不需要响应对象anways.hi@camsf我想返回自定义json,但我无法返回是否可能返回new\ZF\ApiProblem\ApiProblemResponse(new\ZF\ApiProblem\ApiProblem(455,‘成员已删除’);请帮助我,我无法返回自定义json
...
class ItemResource extends AbstractResourceListener
{
    ...
    public function delete($id)
    {
        $service = $this->serviceManager->get('...\ItemService');
        $service->deleteItem($id);
        return true;
    }
    ...
}