2017-08-25 77 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