Symfony2:在单个控制器上处理错误

时间:2014-01-25 09:01:32

标签: web-services exception symfony controller

我做了一个控制器来提供一些JSON的web服务,我想在Symfony抛出异常时提供一些错误信息(错误500),我怎么能写出这样的东西?

Web服务的主要目的是更新调用者在POST值中提供的Symfony DB中的信息。

在我的控制器中我返回JSON中的响应,我想处理Symfony异常(比如提供的值或不符合设计的模式)以返回有关错误的详细信息。

我考虑过对每个值进行测试但是编写时间很长,而不是简单的代码来阅读或使用try / catch系统,但我认为Symfony已经提供了这样的功能。

你怎么看?

Thx:)

2 个答案:

答案 0 :(得分:1)

我认为您应该使用EventListener来捕获错误并返回正确的响应。

您可以将其放在SomethingBundle/EventListener文件夹中,还需要定义service以便Symfony加载。

更多信息:Event Listener

我希望我能帮助你,如果你认为我错了,请告诉我。祝你好运!

修改

如果您只想捕获特定控制器(例如)Webservice中名为SomethingBundle的控制器内的错误,则必须在执行任何操作之前进行检查:

public function onKernelException(GetResponseForExceptionEvent $event)
{       
    $request = $event->getRequest();

    if($this->getBundle($request) == "Something" && $this->getController($request) == "Webservice")
    {
        // Do your magic
        //...
    }
}

private function getBundle(Request $request)
{
    $pattern = "#([a-zA-Z]*)Bundle#";
    $matches = array();
    preg_match($pattern, $request->get('_controller'), $matches);

    return (count($matches)) ? $matches[0] : null;
}

private function getController(Request $request)
{
    $pattern = "#Controller\\\([a-zA-Z]*)Controller#";
    $matches = array();
    preg_match($pattern, $request->get('_controller'), $matches);

    return (count($matches)) ? $matches[1] : null;
}

DANGER 此代码未经过测试,只是您构建自己的代码的一种方法。但是,如果我有问题,请告诉我。我想保持我的例子清洁。

答案 1 :(得分:0)

在沙盒中使用JsonResponse Symfony类:

use Symfony\Component\HttpFoundation\JsonResponse;


$data = array(); // array of returned response, which encode to JSON
$data['error_message'] = 'Bad request or your other error...'); 

$response = new JsonResponse($data, 500); // 500 - response status
return $response;