Laravel如何在不在控制器中时返回JSON?

时间:2017-08-25 12:29:45

标签: php json laravel-5 laravel-5.3

是否有某种方法可以通过使用与abort()函数类似的东西从laravel返回JSON。

从控制器返回JSON很容易我们可以调用

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

但是从其他地方(例如自定义类)返回JSON我必须创建一个返回到控制器的链。

有没有办法在不诉诸回归链的情况下返回json。 就像使用abort()函数一样。 我想使用类似于abort(400, 'my message')的东西但是返回html就像abort一样返回JSON。

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

我会感谢解决方案,适用于laravel 5.3及以上。

1 个答案:

答案 0 :(得分: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块中显然失败了。