如何配置FOSRestBundle以不干扰自定义异常控制器

时间:2016-10-05 07:07:54

标签: symfony exception-handling fosrestbundle

我刚刚将Symfony 2.7页面更新为2.8。除了Symfony本身,还有许​​多其他软件包也已更新。 FOSRestBundle已从版本1.4更新为2.1。

更新后,我为CustomExceptionController配置的Twig不再有效。像404或500这样的错误显示默认的异常页面而不是我的自定义页面。

这是配置:

// app/config/config.yml
...
twig:
    exception_controller:  app.exception_controller:showAction


// src/MyAppBundle/Resources/config/services.yml
app.exception_controller:
    class: MyAppBundle\Controller\CustomExceptionController
    arguments: ['@twig', '%kernel.debug%', "@translator.default" ]


// src/MyAppBundle/Controller/CustomExceptionController.php
use Symfony\Component\Debug\Exception\FlattenException;    

class CustomExceptionController extends ExceptionController {   

protected $translator;

public function __construct(\Twig_Environment $twig, $debug, Translator $translator) {
    parent::__construct($twig, $debug);
    $this->translator = $translator;
}

public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null) {
    ...
}

another thread的帮助下,我能够弄清楚,问题是由我根据FOSRestBundle Update notes进行的配置更改引起的:

removed the ability of the AccessDeniedListener to render a response.
Use the FOSRestBundle or the twig exception controller in complement.
...
After:
     fos_rest:
        access_denied_listener: true
        exception: true # Activates the FOSRestBundle exception controller

根据此提示和Symfony docs,我将fos_rest:exception:enabled: true添加到config.yml

// Before the Update:
fos_rest:
    ...
    access_denied_listener:
        json: true  
    exception:
        codes:
            'Symfony\Component\Routing\Exception\ResourceNotFoundException': 404
            'Doctrine\ORM\OptimisticLockException': HTTP_CONFLICT
        messages:
            'Symfony\Component\Routing\Exception\ResourceNotFoundException': true

// After the Update:
fos_rest:
    ...
    access_denied_listener:
        json: true  
    exception:
        enabled: true  # <<< Added this line
        codes:
            'Symfony\Component\Routing\Exception\ResourceNotFoundException': 404
            'Doctrine\ORM\OptimisticLockException': HTTP_CONFLICT
        messages:
            'Symfony\Component\Routing\Exception\ResourceNotFoundException': true

根据Symfony docs,版本1.4中已经需要选项fos_rest:exception:enabled: true来实际启用FOS异常控制器。因此,我不确定,如果在更新之前配置是正确的,并且FOS异常控制器是否按预期工作。

但是,没有必要将fos_rest:exception:enabled: true设置为正确使用access_denied_listener

所以问题是: access_denied_listener应该能够正常工作(必须设置fos_rest:exception:enabled: true)并且我的Twig异常控制器仍然应该处理异常(如果设置fos_rest:exception:enabled: true则不起作用)。< / p>

如何在不干扰我的Twig异常控制器的情况下正确设置/使用FOS异常控制器?

1 个答案:

答案 0 :(得分:0)

我认为答案可以在这里找到:

https://symfony.com/doc/master/bundles/FOSRestBundle/4-exception-controller-support.html

  

默认情况下,FOSRestBundle为异常呈现定义了两个服务   它配置只支持的fos_rest.exception.controller   通过序列化器渲染。如果没有明确的控制器   用户配置并检测到TwigBundle   自动配置fos_rest.exception.twig_controller   另外还支持通过Twig渲染。

所以你需要扩展: FOS \ RestBundle \控制器\ TwigExceptionController