【问题标题】:Laravel how to return JSON when not in controller?Laravel 不在控制器中时如何返回 JSON?
【发布时间】:2018-02-03 12:13:27
【问题描述】:

有没有办法通过使用类似于abort() 函数的东西从 laravel 返回 JSON。

从控制器返回 JSON 很简单,我们可以调用

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

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

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

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

我非常感谢适用于 laravel 5.3 及更高版本的解决方案。

【问题讨论】:

    标签: php json laravel-5 laravel-5.3


    【解决方案1】:

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

    控制器应获取控制器负责生成适当响应的数据。你不应该把响应委托给几乎所有地方

    您还应该避免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 块中失败了。

    【讨论】:

    • 谢谢,这正是我想要的。我确实明白,如果用于返回数据,这种方法是一种黑客攻击。当Accept: application/json 不在请求标头中时,我正在寻找一种返回 JSON 错误消息的方法
    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 2017-01-28
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2019-04-25
    • 2017-11-15
    相关资源
    最近更新 更多