【发布时间】:2016-05-21 15:34:08
【问题描述】:
我正在使用 Laravel 5 构建一个 REST API。
在 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 肯定支持这一点。
最好/最干净的方法是什么?或者有没有更好的方法从 Laravel REST API 返回运行时(而不是验证时)错误?
【问题讨论】:
-
你为什么不能做一个
return response()->json( ['error'=>'Your custom message'] );? -
可以构建自定义json响应类
-
return response()->json()会返回 200 OK。我想使用适当的非 200 响应代码(例如 500 Internal Server Error)。是的,我也可以手动编写代码——我只是假设 Laravel 已经提供了一种内置的、更结构化的方式来执行此操作。也许这是一个不正确的假设。 -
为此考虑github.com/dingo/api。
-
@greenie2600 :你得到解决方案了吗?
标签: laravel laravel-5 laravel-5.2