![](/img/trans.png)
[英]Symfony2 + FOSRestBundle: Enable/disable REST functionality per controller/action?
[英]How to catch all exceptions that could arise in Symfony2 controller action?
我正在尝试构建一个REST Web服务,为所有调用返回JSON。 通常这很简单,我只是喜欢这样:
return new Response(json_encode($return_object));
我的问题是,我应该如何以全球方式拦截异常? 我想这样做,因为如果我的应用程序中的任何地方发生异常,我仍然希望向客户端返回一条JSON消息,基本上说“哟dawg,我听说你喜欢异常”。 我的想法是,在成功和失败案例中返回JSON将简化任何客户端实现我的API所需的工作。
到目前为止,我唯一能想到的是编写每个控制器动作,如下所示:
public function generateMemeAction($arg1, $arg2) {
$return_object = array();
try {
// stuff to generate meme here
$return_object['status'] = "GREAT SUCCESS!";
} catch (Exception $e) {
// epic fail
$return_object['status'] = "UnluckyBrianException";
}
return new Response(json_encode($return_object));
}
这一切都很精彩,但是对于我的应用程序中的每个动作,try-catch块都是相同的,每次我必须编辑一堆复制意大利面时,我会觉得很傻。 专业提示?
REST应用程序有不同类型的错误。 例如,您可能有逻辑错误或输入错误(并非所有参数都已发送)。 应使用不同的方法处理不同类型的错误。 这种情况的最佳方法是手动处理这些错误。
您可以添加到Controller特殊错误方法(并将其放入父类),这将返回错误代码+错误文本。
但是如果你想使用自动处理,你可以使用Exception监听器:
这是一个示例:
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
$response = new Response();
// setup the Response object based on the caught exception
$event->setResponse($response);
// you can alternatively set a new Exception
// $exception = new \Exception('Some special exception');
// $event->setException($exception);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.