2017-06-06 58 views
2

我有以下类:Laravel JSON响应未示出的自定义对象数据

<?php 
namespace App\Libraries; 

use Illuminate\Contracts\Support\Arrayable; 

class ErrorResponse implements Arrayable { 

    private $error; 

    function __construct($code, $message) { 
     $this->error = array('code' => $code, 'message' => $message); 
    } 

    function toArray() { 
     return $this->error; 
    } 

} 

然后,控制器我有作为响应于:

$data['message'] = 'hello'; 
$data['error'] = new ErrorResponse($code, 'Something is bad'); 
return response()->json($data, $code); 

在我得到以下结果的应答:

{ 
    "error": {}, 
    "message": "hello" 
} 

但我期待

{ 
    "error": { 
     "code": 422, 
     "message": "Something is bad" 
    }, 
    "message": "hello" 
} 

有关如何使Laravel响应嵌套对象(ErrorResponse)内容的任何想法?

+0

您需要实现'JsonSerializable'接口或公开$ error。 – jfadich

回答

1

既然你给一个纯arrayjson(),Laravel只是passes it straight to json_encode。你要么需要:

  1. json()呼叫的ArrayableJsonSerializable对象有Laravel递归展开值,
  2. 使$error一个public所以json_decode可以使用它,或
  3. 做你自己,你给出的例子是多么简单:

    $data['error'] = (new ErrorResponse($code, 'Something is bad'))->toArray();

+1

添加接口JsonSerializable并实现为函数jsonSerialize(){return $ this-> error; } – JohnnyAce