【问题标题】:Is there a way to pass a JsonSerializable object as an array parameter?有没有办法将 JsonSerializable 对象作为数组参数传递?
【发布时间】:2020-02-13 09:15:10
【问题描述】:

我正在更新 REST Api 类;在每个方法结束时,我必须调用DoResponse 方法将我作为第一个参数传递的数据转换为JSON 字符串。

作为需求的一部分,我为每个端点创建了响应对象;所有这些对象都实现了\JSONSerializable

class CustomResponseObject implements JsonSerializable {
    public function jsonSerialize() {
        return [/*...*/];
    }
}

然后我在我的 Api 方法中实例化这些对象并将其传递给 DoResponse 函数。

function myApiEndpoint() {
    $res = new CustomResponseObject();
    /*...*/
    return $this->DoResponse($res);
}

问题是,该方法只接受数组作为第一个参数。

public function DoResponse(array $response = array());

我可以通过传递$res->jsonSerialize() 来解决这个问题,但是有没有办法在我将对象传递给DoResponse 函数时自动对对象进行jsonSerialize,而无需更改底层方法?

【问题讨论】:

  • return $this->DoResponse([$res]);
  • @EmptyBrain 很抱歉,但这会改变响应内容,这是不可接受的

标签: php php-7 php-7.3


【解决方案1】:

最后,我们决定采用的解决方案是像这样更改DoResponse()方法的签名和前几行:

public function DoResponse($response = array()) {
    if($response instanceof JsonSerializable) {
        $response = $response->jsonSerialize();
    }
    if(is_array($response) === false) {
        // Error handling
    }

    // Previous function body.
}

没有什么令人兴奋的,但显然目前还没有办法让这个过程完全自动化。

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 2023-01-27
    • 2017-07-10
    • 2017-09-25
    • 2015-01-10
    • 2021-12-20
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多