2017-08-25 90 views
1

有没有一些方法可以使用类似于abort()函数的方式从laravel返回JSON。Laravel如何在不在控制器中时返回JSON?

从控制器返回JSON是很容易,我们只需调用

return response()->json(['message' => 'my mesage'], 200);

但是从别的地方(例如自定义类)返回JSON我要创建一个回链控制器上。

有没有一种办法,而不诉诸返回链返回JSON。 就像使用abort()函数一样。 我想使用类似于abort(400, 'my message')的东西,但insted返回HTML像中止不返回JSON。

或者是有没有办法覆盖abort返回JSON。

我会心存感激的解决方案,为laravel 5.3及以上的作品。

回答

2

首先,如果你发现自己想知道你需要检查你的代码,这样的事情。

控制器应得到其中控制器是负责生成适当的响应数据。你不应该委托制作的反应,只是到处

你也应该避免abort外控制器,你应该抛出适当的异常。

话虽这么说这里是一个脂肪丑陋的黑客对您:

创建一个例外:

class JsonResponse extends Exception { 
    private $data; 

    public __construct($data, $message = null, $code = 0, $previous = null) { 
      $this->data = $data; 
      parent::__construct($message,$code,$previous); 
    } 
} 

在异常处理程序:通常App\Exceptions\Handler

protected $dontReport = [ 
     // other lines 
     JsonResponse::class // 
]; 

public function render($request, Exception $exception) { 
     if ($exception instanceof JsonResponse) { 
       return reponse()->json($e->getData()); 
     } 
     //Other lines 
} 

然后,每当你需要立即返回一个JSON响应只是:

throw new JsonResponse($data); 

但是,这显然在try-catch块内失败。

+0

感谢这正是我正在寻找。我明白,如果用于返回数据,这种方法是一种黑客攻击。当'Accept:application/json'不在请求头中时,我正在寻找一种方法来返回JSON错误消息 – Ragas