有没有办法通过使用类似于abort()
函数的东西从laravel返回JSON。
从控制器返回JSON很容易,我们只需调用
return response()->json(['message' => 'my mesage'], 200);
但是从其他地方(例如自定义类(要返回 JSON,我必须创建一个返回链到控制器。
有没有办法在不诉诸返回链的情况下返回 json。 就像使用abort()
功能一样。 我想使用类似于abort(400, 'my message')
的东西,但不是像中止那样返回 html,而是返回 JSON。
或者有没有办法覆盖abort
以返回 JSON。
我将不胜感激适用于 laravel 5.3 及更高版本的完整解决方案。
首先,如果你发现自己想知道这些事情,你需要审查你的代码。
控制器应获取控制器负责为其生成相应响应的数据。您不应该将响应委托给几乎所有地方
您还应该避免abort
外部控制器,您应该抛出适当的异常。
话虽如此,这里有一个胖丑陋的黑客给你:
创建例外:
class JsonResponse extends Exception {
private $data;
public __construct($data, $message = null, $code = 0, $previous = null) {
$this->data = $data;
parent::__construct($message,$code,$previous);
}
}
在您的异常处理程序中:通常AppExceptionsHandler
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);
但是,这显然在尝试捕获块中失败。