php Symfony-根据内容类型给出所有API响应

5fjcxozz  于 2023-01-24  发布在  PHP
关注(0)|答案(1)|浏览(113)

路线.yaml x1c 0d1x
无论内容类型是什么,我都希望响应是那种类型的。我该怎么做呢?
我希望它是响应,按内容类型。我希望它是全局的。例如;如果内容类型为json,则响应必须为json。如果内容类型为XML,则响应应返回XML。如果内容类型为xxx,则响应应返回xxx
系统本身应该根据content-type自动确定返回类型,这在symfony中可能吗?因为Symfony默认以xml格式返回异常,如果API用户以json格式发送content-type并接收异常,则以xml格式接收,我不希望这样。
我可以编写_format json或xml,但我希望它是动态的

eqqqjvef

eqqqjvef1#

检查HttpKernel如何处理响应。
要让response type动态响应客户端发送的Accept标头,必须为其编写某种Map器。
您应该编写一些订阅器/侦听器来将响应转换为所需的格式:

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

final class ResponseSubscriber implements EventSubscriberInterface
{
    public function __contstruct(private Request $request) {}

    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::RESPONSE => 'onResponse',
        ];
    }

    public function onResponse(ResponseEvent $event): void
    {
        // Skip on internal requests. E.g. redirect
        if (!$event->isMainRequest()) {
            return;
        }

        $data = $event->getResponse();

        $requestedType = $this->request->headers->has('Accept')
            ? $this->request->headers->get('Accept')
            : 'application/json';

        $response = match ($requestedType) {
             'application/json' => $this->getJsonResponse($data),
             'application/xml' => $this->getXmlResponse($data),
             'text/html' => $this->getHtmlResponse($data),
             ...
             default => throw new \InternalException('Request type ' . $requestedType . ' is not supported'), // This better be checked on KernelEvents::REQUEST
        }

        $event->stopPropagation();
        $response->setResponse($response);
    }
}

您可以使用XDebug进行分步调试,并查看响应数据的传输位置,以便更好地理解Symfony的内部结构。

相关问题