Php Symfony5-覆盖非HTML格式的错误输出

Php Symfony5-覆盖非HTML格式的错误输出,php,symfony,error-handling,symfony5,Php,Symfony,Error Handling,Symfony5,我尝试通过官方文件处理所有例外情况(Symfony 5): 我想将所有异常序列化为JSON格式。 我在本主题中阅读了类似问题的解决方案: 但这并不能解决我的问题 这里有我的文件:src/Controller/ShowController.php <?php namespace App\Controller; use App\Component\ShowResponseHandlerInterface; use Symfony\Bundle\FrameworkBundle\Control

我尝试通过官方文件处理所有例外情况(Symfony 5):

我想将所有异常序列化为JSON格式。 我在本主题中阅读了类似问题的解决方案: 但这并不能解决我的问题

这里有我的文件:src/Controller/ShowController.php

<?php

namespace App\Controller;

use App\Component\ShowResponseHandlerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;

class ShowController extends AbstractController
{
    /**
     * @Route("/show/{file}", name="show", requirements={"file"=".+"})
     */
    public function index(string $file, string $storageDirectory): Response
    {
        $absolutePath = $storageDirectory.$file;
        if(!file_exists($absolutePath)) {
            throw new NotFoundHttpException("Resource not exists");
        }

        return new BinaryFileResponse($absolutePath);

    }
}
当然,我已经安装了软件包symfony/serializer

composer show -i | grep "symfony/serializer"

symfony/serializer                 v5.2.9  Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON
我做错了什么或什么没有配置? 它总是返回html输出

更新

控制台输出用于:

symfony console debug:container | grep normalizer
  Symfony\Component\Serializer\Normalizer\DenormalizerInterface                alias for "serializer"                                                                     
  Symfony\Component\Serializer\Normalizer\ObjectNormalizer                     alias for "serializer.normalizer.object"                                                   
  Symfony\Component\Serializer\Normalizer\PropertyNormalizer                   alias for "serializer.normalizer.property"                                                 
  maker.auto_command.make_serializer_normalizer                                Symfony\Bundle\MakerBundle\Command\MakerCommand                                            
  maker.maker.make_serializer_normalizer                                       Symfony\Bundle\MakerBundle\Maker\MakeSerializerNormalizer                                  
  serializer.denormalizer.array                                                Symfony\Component\Serializer\Normalizer\ArrayDenormalizer                                  
  serializer.denormalizer.unwrapping                                           Symfony\Component\Serializer\Normalizer\UnwrappingDenormalizer                             
  serializer.normalizer.constraint_violation_list                              Symfony\Component\Serializer\Normalizer\ConstraintViolationListNormalizer                  
  serializer.normalizer.data_uri                                               Symfony\Component\Serializer\Normalizer\DataUriNormalizer                                  
  serializer.normalizer.dateinterval                                           Symfony\Component\Serializer\Normalizer\DateIntervalNormalizer                             
  serializer.normalizer.datetime                                               Symfony\Component\Serializer\Normalizer\DateTimeNormalizer                                 
  serializer.normalizer.datetimezone                                           Symfony\Component\Serializer\Normalizer\DateTimeZoneNormalizer                             
  serializer.normalizer.flatten_exception                                      Symfony\Component\Messenger\Transport\Serialization\Normalizer\FlattenExceptionNormalizer  
  serializer.normalizer.form_error                                             Symfony\Component\Serializer\Normalizer\FormErrorNormalizer                                
  serializer.normalizer.json_serializable                                      Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer                         
  serializer.normalizer.mime_message                                           Symfony\Component\Serializer\Normalizer\MimeMessageNormalizer                              
  serializer.normalizer.object                                                 Symfony\Component\Serializer\Normalizer\ObjectNormalizer                                   
  serializer.normalizer.problem                                                Symfony\Component\Serializer\Normalizer\ProblemNormalizer                                  
  serializer.normalizer.property                                               Symfony\Component\Serializer\Normalizer\PropertyNormalizer                                 
  serializer.normalizer.uid                                                    Symfony\Component\Serializer\Normalizer\UidNormalizer                                      

 // To search for a specific service, re-run this command with a search term. (e.g. debug:container log) 

尝试从config/services.yaml中删除App\Serializer\ProblemNormalizer。再次检查容器中的规范化程序
symfony控制台调试:容器| grep normalizer
。通常,您应该在列表中看到您的规范化程序,而不需要任何配置(Symfony通过NormalizerInterface识别它)。测试
curlhttp://localhost:8000/show/foo.doc -H“Accept:application/json”

您是否可以检查您的规范化程序是否配置为运行
symfony console debug:container | grep normalizer
@qdequippe Yes。我在问题中添加了控制台的输出。谢谢!。原因是。1.不需要的服务:App\Serializer\ProblemNormalizer 2。其次是。我没有以json:Accept:application/json的形式发送带有接受响应的标题。现在我有了json格式的良好响应{“success”:false,“exception”:{“message”:“Resource not exists”,“code”:404}}考虑使用
$context
:例如,限制响应消息,
if($context['debug']){$message=$exception->getMessage()}否则{$message exception=$exception->getStatusText()}
,您还可以从原始异常添加额外数据,或根据
$context['exception']
相应地翻译消息。
composer show -i | grep "symfony/serializer"

symfony/serializer                 v5.2.9  Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON
symfony console debug:container | grep normalizer
  Symfony\Component\Serializer\Normalizer\DenormalizerInterface                alias for "serializer"                                                                     
  Symfony\Component\Serializer\Normalizer\ObjectNormalizer                     alias for "serializer.normalizer.object"                                                   
  Symfony\Component\Serializer\Normalizer\PropertyNormalizer                   alias for "serializer.normalizer.property"                                                 
  maker.auto_command.make_serializer_normalizer                                Symfony\Bundle\MakerBundle\Command\MakerCommand                                            
  maker.maker.make_serializer_normalizer                                       Symfony\Bundle\MakerBundle\Maker\MakeSerializerNormalizer                                  
  serializer.denormalizer.array                                                Symfony\Component\Serializer\Normalizer\ArrayDenormalizer                                  
  serializer.denormalizer.unwrapping                                           Symfony\Component\Serializer\Normalizer\UnwrappingDenormalizer                             
  serializer.normalizer.constraint_violation_list                              Symfony\Component\Serializer\Normalizer\ConstraintViolationListNormalizer                  
  serializer.normalizer.data_uri                                               Symfony\Component\Serializer\Normalizer\DataUriNormalizer                                  
  serializer.normalizer.dateinterval                                           Symfony\Component\Serializer\Normalizer\DateIntervalNormalizer                             
  serializer.normalizer.datetime                                               Symfony\Component\Serializer\Normalizer\DateTimeNormalizer                                 
  serializer.normalizer.datetimezone                                           Symfony\Component\Serializer\Normalizer\DateTimeZoneNormalizer                             
  serializer.normalizer.flatten_exception                                      Symfony\Component\Messenger\Transport\Serialization\Normalizer\FlattenExceptionNormalizer  
  serializer.normalizer.form_error                                             Symfony\Component\Serializer\Normalizer\FormErrorNormalizer                                
  serializer.normalizer.json_serializable                                      Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer                         
  serializer.normalizer.mime_message                                           Symfony\Component\Serializer\Normalizer\MimeMessageNormalizer                              
  serializer.normalizer.object                                                 Symfony\Component\Serializer\Normalizer\ObjectNormalizer                                   
  serializer.normalizer.problem                                                Symfony\Component\Serializer\Normalizer\ProblemNormalizer                                  
  serializer.normalizer.property                                               Symfony\Component\Serializer\Normalizer\PropertyNormalizer                                 
  serializer.normalizer.uid                                                    Symfony\Component\Serializer\Normalizer\UidNormalizer                                      

 // To search for a specific service, re-run this command with a search term. (e.g. debug:container log)