json_encode仅适用于带有自定义toArray的Model的JSON_PARTIAL_OUTPUT_ON_ERROR

时间:2015-03-16 17:16:03

标签: php json eloquent laravel-5

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

class User extends Model{

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

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

  Response.php第403行中的

UnexpectedValueException :响应内容必须是实现__toString()的字符串或对象,   "布尔"给出。

我已将错误追踪到JsonResponse.setData($data)-method,其中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,它就可以正常工作,即使不是部分的。

我是否忽视了一些明显的东西?

1 个答案:

答案 0 :(得分:2)

问题在于我使用的eloquent-meta插件。这是my issue的相关部分:

  

我将错误追溯到了   Helpers.maybeDecode($value)-method

     

当前实现尝试使用解析值   json_decode($value)并通过检查确认是否有效   json_last_error() - 功能。问题是,这并没有重置   最后一个错误。

     

调用Helpers.maybeDecode($value) - 方法时, while   Laravel是编码模型,以及它尝试解码的值   是一个有效的json(例如,一个简单的字符串),错误   代码已设置,导致json_encode() - 函数查看并返回   null。问题在于错误变量的全局性。

     

我建议的解决方法是重置   json_last_error() - 检查装饰是否有效后的功能,以及   我发现这样做的唯一方法是通过解码有效的东西(甚至   如果它只是一个空数组。)

以下是修复的Pull Request