如何捕获Symfony2控制器操作中可能出现的所有异常?

时间:2012-07-06 21:24:16

标签: rest exception-handling symfony

我正在尝试构建一个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块都是相同的,每次我必须编辑一堆复制意大利面时,我会觉得很傻。专业提示?

1 个答案:

答案 0 :(得分:17)

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);
}