【发布时间】:2015-02-18 09:53:36
【问题描述】:
我有一个 Laravel 4.2 应用程序,路径如下:
Route::group(['prefix' => 'api/v1'], function()
{
Route::resource('service_logs', 'ServiceLogsController', [
'only' => ['index', 'store', 'show']
]);
});
ServiceLogsController 控制器从ApiController 扩展而来,看起来像这样缩减版:
class ApiController extends \BaseController {
protected $statusCode = 200;
public function getStatusCode()
{
return $this->statusCode;
}
public function setStatusCode($statusCode)
{
$this->statusCode = $statusCode;
return $this;
}
public function respondInternalError($message = 'Internal Error!')
{
return $this->setStatusCode(500)->respondWithError($message);
}
public function respondWithError($message)
{
return Response::json([
'error' => [
'message' => $message,
'status_code' => $this->getStatusCode()
]
], $this->getStatusCode());
}
// ...
}
我想做的是,当发生未捕获的异常时,我想在我的 ApiController 上调用 respondInternalError() 方法,以便 API 使用者有一致的响应,而不是什么都没有或 html whoops 错误。
为此,我尝试在我的app/start/global.php 中添加以下代码
App::error(function(Exception $exception, $code)
{
Log::error($exception);
if (Request::is('api/*'))
{
App::make('ApiController')->respondInternalError('Uncaught api exception error occurred - ' . $exception->getMessage());
}
});
为了测试它,我尝试向以下网址发出 POST 请求:/api/v1/service_logs/123。
这不起作用,因为该 URL 是一个 GET url,所以 Laravel 会抛出正确的 method not allowed exception。但是,它并没有被抓住。
知道如何为每个控制器类实现一个捕获所有异常处理程序吗?
更新 稍微改进了工作“全局”api异常处理程序
App::error(function(Exception $exception, $code)
{
Log::error($exception);
if (Request::is('api/*'))
{
$errorName = Symfony\Component\HttpFoundation\Response::$statusTexts[$code];
return App::make('ApiController')
->setStatusCode($code)
->respondWithError($errorName . ' error has occurred.');
}
});
发生错误时,您现在可以得到这个(在 Chrome + Postman 中完成测试):
【问题讨论】:
-
以静态方式调用 Request::is() 在我的设置中返回异常...
-
我尝试直接调用
App::make('ApiController')->respondInternalError()而不检查请求以查看我的方法是否至少被调用,但不是。 -
对于 Laravel 5 中的用户,这可能会帮助您完成这项工作。 stackoverflow.com/questions/26630985/…
标签: php laravel laravel-4 exception-handling