Php Symfony5-覆盖非HTML格式的错误输出
我尝试通过官方文件处理所有例外情况(Symfony 5): 我想将所有异常序列化为JSON格式。 我在本主题中阅读了类似问题的解决方案: 但这并不能解决我的问题 这里有我的文件:src/Controller/ShowController.phpPhp 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
<?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)