buduję REST API z laravel 5.Jak zwrócić błędy AJAX ze sterownika Laravel?
W laravel 5 można podklasy App\Http\Requests\Request
zdefiniowanie reguł sprawdzania poprawności, które muszą być spełnione, zanim zostaną przetworzone danej trasie. Na przykład:
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class BookStoreRequest extends Request {
public function authorize() {
return true;
}
public function rules() {
return [
'title' => 'required',
'author_id' => 'required'
];
}
}
Jeśli klient ładuje odpowiednią drogę poprzez żądanie AJAX i BookStoreRequest
stwierdzi, że wniosek nie spełnia reguł, to automagicznie zwróci błąd (y) jako obiekt JSON. Na przykład:
{
"title": [
"The title field is required."
]
}
Jednak metoda Request::rules()
może jedynie potwierdzić wejściowego, a nawet jeśli wejście jest ważne, inne rodzaje błędów mogą pojawić się po wniosek został już zaakceptowany i przekazany do sterownika. Na przykład, powiedzmy, że kontroler musi napisać nowe informacje książkę do pliku z jakiegoś powodu-ale plik nie może zostać otwarty:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Http\Requests\BookCreateRequest;
class BookController extends Controller {
public function store(BookStoreRequest $request) {
$file = fopen('/path/to/some/file.txt', 'a');
// test to make sure we got a good file handle
if (false === $file) {
// HOW CAN I RETURN AN ERROR FROM HERE?
}
fwrite($file, 'book info goes here');
fclose($file);
// inform the browser of success
return response()->json(true);
}
}
Oczywiście, mogłem tylko die()
, ale to bardzo brzydkie. Wolałbym, aby mój komunikat o błędzie był wyświetlany w tym samym formacie, co błędy sprawdzania poprawności. W ten sposób:
{
"myErrorKey": [
"A filesystem error occurred on the server. Please contact your administrator."
]
}
Mogłabym zbudować własny obiekt JSON i go zwrócić, ale na pewno Laravel wspiera to natywnie.
Jaki jest najlepszy/najczystszy sposób to zrobić? Czy istnieje lepszy sposób na zwrócenie błędów Runtime (w przeciwieństwie do sprawdzania poprawności) z Laravel REST API?
Dlaczego nie możesz po prostu wykonać 'return response() -> json (['error' => 'Your custom message']);'? –
Możesz zbudować niestandardową klasę odpowiedzi json – Digitlimit
'return response() -> json()' zwróci ją z 200 OK. Chcę użyć odpowiedniego kodu odpowiedzi innego niż 200 (np. 500 Błąd wewnętrznego serwera). Tak, mógłbym też to zaszyfrować - po prostu założyłem, że Laravel zapewnia już wbudowany, bardziej uporządkowany sposób robienia tego. Może to błędne założenie. – greenie2600