Я создаю REST API с Laravel 5.
В Laravel 5 вы можете подклассом App\Http\Requests\Request
определить правила проверки, которые должны быть выполнены до того, как будет обработан конкретный маршрут. Например:
<?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'
];
}
}
Если клиент загружает соответствующий маршрут через запрос AJAX, а BookStoreRequest
обнаруживает, что запрос не удовлетворяет правилам, он автоматически возвращает ошибку (-ы) как объект JSON. Например:
{
"title": [
"The title field is required."
]
}
Однако метод Request::rules()
может только проверять ввод, и даже если вход действителен, могут возникнуть другие виды ошибок после того, как запрос уже принят и передан контроллеру. Например, скажем, что контроллеру необходимо по какой-то причине записать новую информацию о книге в файл, но файл не может быть открыт:
<?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 );
}
}
Очевидно, я мог бы просто die()
, но это супер уродливо. Я бы предпочел вернуть мое сообщение об ошибке в том же формате, что и ошибки проверки. Вот так:
{
"myErrorKey": [
"A filesystem error occurred on the server. Please contact your administrator."
]
}
Я мог бы создать свой собственный объект JSON и вернуть его, но, конечно же, Laravel поддерживает это.
Какой лучший/самый чистый способ сделать это? Или есть лучший способ вернуть ошибки времени выполнения (в отличие от проверки времени) из LARvel API REST?