是否有某种方法可以通过使用与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及以上。
答案 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块中显然失败了。