json_encode仅适用于具有自定义 toArray 的模型JSON_PARTIAL_OUTPUT_ON_ERROR


json_encode only works with JSON_PARTIAL_OUTPUT_ON_ERROR for Model with custom toArray

我有一个雄辩模型,我为此创建了一个自定义toArray()方法,以包含元表中的字段(我通过使用雄辩元插件获得):

class User extends Model{
    // ... Other stuff
    public function toArray(){
        return array_merge(parent::toArray(), $this->getAllMeta()->toArray());
    }
}

当我现在尝试使用 Response::json(...) 将此模型作为 JSON 响应发送时,我得到:

响应中的 UnexpectedValueException.php第 403 行:响应内容必须是实现 __toString() 的字符串或对象 给出"布尔值"。

我已经将错误追溯到JsonResponse.setData($data) -方法,其中json_encode -调用返回 false。json_last_error() -方法返回JSON_ERROR_SYNTAXjson_last_error_msg() -方法返回Syntax error

使用调试器,我停在下面的行上并自己评估了该语句。正如预期的那样,它不起作用,但是如果我这样称呼它,它可以工作:

json_encode($data, JSON_PARTIAL_OUTPUT_ON_ERROR);

这将返回我期望的完整、有效的 JSON,没有任何缺失值或 NULL 值。

更奇怪的是,如果我停止toArray()方法并将合并的数组提供给json_encode,即使没有部分,它也能正常工作。

我在这里忽略了一些明显的东西吗?

问题出在我使用的雄辩元插件上。这是我问题中的相关部分:

我将错误追溯到 Helpers.maybeDecode($value)方法:

当前实现尝试使用 json_decode($value)并检查是否有效,通过检查 json_last_error() -函数。问题是,这不会重置 最后一个错误。

当调用Helpers.maybeDecode($value)方法时, Laravel正在对模型进行编码,以及它试图解码的值 不是有效的 JSON(例如,简单的字符串),错误 代码被设置,导致 json_encode() 函数看到它并返回 null .问题在于误差变量的全局性质。

我建议的解决方法是重置 json_last_error() -函数在检查解码是否有效后,并且 我发现这样做的唯一方法是解码有效的东西(甚至 如果它只是一个空数组)。

这是带有修复程序的拉取请求。