首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Symfony2,FOSRestBundle -捕获异常

Symfony2,FOSRestBundle -捕获异常
EN

Stack Overflow用户
提问于 2015-11-30 15:50:37
回答 2查看 792关注 0票数 3

我有Symfony应用程序,我使用FOSRestBundle和AngularJS。我的Symfony应用程序没有任何视图。

我想在AngularJS中用ngToast模块显示从服务器接收到的信息。

如果我创建或更新了一些东西,就很容易显示出来。但是如果服务器抛出异常呢?例如,角质客户端尝试获取具有错误ID的项,还是该用户没有权限执行此操作?在这种情况下,服务器将抛出异常,但我希望显示适当的消息。

symfony能否捕获此异常,例如将其转换为Response对象?例如,如果我没有异常,则symfony应该捕获它并制作如下内容:

代码语言:javascript
运行
复制
return new Response(400, "You don't have permission to acces this route");

角将得到:

代码语言:javascript
运行
复制
{
    "code": 400,
    "message": "You don't have permission to acces this route"
}

有可能吗?我怎么发动汽车呢?也许我该换个方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-30 16:29:25

是的当然这是可能的。我建议您实现一个简单的异常侦听器。并使所有异常类扩展一个BaseException或实现一个BaseException,这样您就可以知道哪些异常来自“您的”代码。

代码语言:javascript
运行
复制
class ExceptionListener
{
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        // You get the exception object from the received event
        $exception = $event->getException();

        // Do your stuff to create the response, for example response status code can be exception code, and exception message can be in the body or serialized in json/xml.

        $event->setResponse($response);

        return;
    }

}

在容器中注册:

代码语言:javascript
运行
复制
<service id="your_app.listener.exception" class="App\ExceptionListener">
    <tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" />
</service>
票数 2
EN

Stack Overflow用户

发布于 2015-12-02 22:05:08

我建议采用更多的FOSRestBundle方法,即配置异常,以及是否应该显示消息:

代码语言:javascript
运行
复制
fos_rest:
  exception:
    enabled: true
    codes:
      'Symfony\Component\Routing\Exception\ResourceNotFoundException': HTTP_FORBIDDEN
    messages:
      'Symfony\Component\Routing\Exception\ResourceNotFoundException': true

假设您有一个针对特定操作的自定义AccessDeniedException,您可以创建异常并将其放入配置中。

代码语言:javascript
运行
复制
<?php
class YouCantSummonUndeadsException extends \LogicException
{
}

无论你扔到哪里:

代码语言:javascript
运行
复制
<?php
throw new YouCantSummonUndeadsException('Denied!');

您可以配置它:

代码语言:javascript
运行
复制
    codes:
      'My\Custom\YouCantSummonUndeadsException': HTTP_FORBIDDEN
    messages:
      'My\Custom\YouCantSummonUndeadsException': true

得到的结果如下:

代码语言:javascript
运行
复制
{
    "code": 403,
    "message": "Denied!"
}

我希望这能让事情更清楚!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34002530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档