如何在Symfony2中包装控制器的操作?

时间:2014-01-23 18:01:42

标签: php ajax symfony url-routing

是否可以将一些控制器的操作包装在Symfony2中的自定义逻辑中?

我想创建一个“AJAX”控制器,以便处理我的应用程序中的所有AJAX请求。我想从我的操作中删除样板代码,以使应用程序逻辑更轻松。以下是我想通过包装器实现的一些要点:

  1. try ... catch块中包装动作调用,以捕获所有可能的异常并将输出转换为JSON而不是一般的500 HTML错误页面。所以我可以在客户端优雅地处理它们。
  2. 从动作调用中返回普通数组,以便稍后重写它们并将它们转换为适当的JsonResponse对象。
  3. 如果可以实现这样的包装器,是否也可以在路由的基础上启用它?

    UPDATE:

    这是我的例子:

    /**
     * It is now.
     * @return JsonResponse
     */
    public function someAction()
    {
        try {
    
            // Some business logic here.
            $foo = getFoo();
            $bar = getBar($foo);
    
            // Sending response.
            return new JsonResponse([
                'success' => true,
                'data'    => [
                    'foo' => $foo,
                    'bar' => $bar,
                ],
            ]);
    
        } catch (\Exception $exception) {
    
            // Handle exception here. Translate error message, etc.
    
            return new JsonResponse([
                'success' => false,
                'message' => $exception->getMessage(),
                'code'    => $exception->getCode(),
            ]);
        }
    }
    
    /**
     * How I want it to be.
     * @return array
     */
    public function someBetterAction()
    {
        // Some business logic here.
        $foo = getFoo();
        $bar = getBar($foo);
    
        // Sending response.
        return [
            'foo' => $foo,
            'bar' => $bar,
        ];
    }
    

    换句话说,我只是想将异常处理和输出格式化移动到包装层,以使动作更轻松。

1 个答案:

答案 0 :(得分:0)

您可以使用自定义异常处理程序,例如FOSRestBundle(& Docs),它可以(显然)处理通过您的操作过程创建的任何异常。