【问题标题】:FOSRestBundle: show my custom exception messageFOSRestBundle:显示我的自定义异常消息
【发布时间】:2014-09-18 17:04:13
【问题描述】:

我正在尝试在 FOSRestBundle 中添加自定义异常控件,但它似乎忽略了我的自定义消息(响应的状态代码正常)。

我有:

throw new HttpException(404, "User {$id} not found");

但是得到这个 json 响应:

{
  "error": {
    "code": 404,
    "message": "Not Found"
  }
}

所以我找不到显示自定义消息的方法

【问题讨论】:

    标签: php symfony exception fosrestbundle


    【解决方案1】:

    您也可以使用以下配置抛出您自己的异常:

    fos_rest:
        exception:
            codes:
                'My\Custom\NotFound\Exception404': 404
            messages:
                'My\Custom\NotFound\Exception404': true
    

    在您自己的异常类中提供自定义消息,它应该可以按预期工作。

    【讨论】:

    • 我尝试了这个并且仍然获得了 prod 环境中异常的默认 http 消息(例如 400 的错误请求),无论是使用我的自定义异常类还是使用 Symfony 的。它在开发中没有问题。我是否错过了任何其他配置?
    • 尝试在 config.yml 的 twig 部分下设置 exception_controller: 'FOS\RestBundle\Controller\ExceptionController::showAction'
    • 谢谢,在twig 部分设置这个选项就可以了。出于某种原因,文档说它可以在 fos_rest.exception 部分中设置,但它实际上并不接受它。
    • 就个人而言,我添加以删除 var/cache 目录以使其正常工作!谢谢!
    【解决方案2】:

    View Layer documentationIf you don't like the default exception structure, you can provide your own implementation.

    class ExceptionWrapperHandler implements ExceptionWrapperHandlerInterface
    {
        /**
         * @param array $data
         *
         * @return array
         */
        public function wrap($data)
        {
            // we get the original exception
            $exception = $data['exception'];
    
            // some operations
            // ...
    
            // return the array
            return array(
                'code'    => $code,
                'message' => $message,
                'value'   => $value
            );
        }
    }
    


    // config.yml
    fos_rest:
        view:
            exception_wrapper_handler: Namespace\To\ExceptionWrapperHandler
    

    【讨论】:

    • 它不工作,我不使用表单或视图,我总是返回一个带有数据的 JsonResponse。也许这个解决方案没有视图就行不通?
    • 这确实与视图有关。你为什么不使用视图?这不适合您的需求?因为 FOSRestBundle 将 JSON 响应作为视图处理。
    • 我的 api 只是 json,所以我将输入数据作为简单参数(不是 FormType)并总是返回一个 return new JsonResponse($array_data);,当发生异常时我 throw new HttpException(404, "User {$id} not found"); 我很着急部署所以让它更直接
    • 如果你想使用 FOSRest,你可以只返回 JSON。您应该查看文档(和视图层)。它可以做你想做的:)。但无论如何,这个解决方案应该可以工作,FOSRest 使用它来处理异常。
    • 什么都不做=(也许这个功能已经被删除了但是文档还没有更新?
    【解决方案3】:

    显示您的自定义异常消息(只需在 app/config/config.yml 中):

    fos_rest:
        exception:
             messages:
                Symfony\Component\HttpKernel\Exception\HttpException: true
    

    【讨论】:

    • 就个人而言,我添加删除 var/cache 目录以使其正常工作!谢谢!
    【解决方案4】:

    另一个简单的解决方案是,像这样在 fos_rest 配置中设置 debug 标志:

    fos_rest:
        // ...
        exception:
            // ...
            debug: true
    

    这将显示所有异常的实际异常消息。显然这可能存在安全风险,因此请谨慎使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2016-03-12
      • 2010-09-27
      • 1970-01-01
      • 2015-11-04
      • 2012-01-17
      相关资源
      最近更新 更多