【问题标题】:Symfony Controller - How to return XML response?Symfony 控制器 - 如何返回 XML 响应?
【发布时间】:2014-12-02 21:28:38
【问题描述】:

我想在我的RandomController::indexAction() 中返回一个 XML 响应:

return new Response($this->renderView(
    'AcmeRandomBundle:Random:index.xml.twig',
    array(
        'randomParameter' => $randomParameter
    )
));

index.xml.twig 是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<randomTag>
    {{ randomParameter }}
</randomTag>

当我想在firefox中打开这个动作时,我进入了firebug:

<html>
   <body>
    <randomTag>
        randomValue
    </randomTag>
   </body>
</html>

如何返回正确的 XML 响应?

【问题讨论】:

  • 你如何构建$randomParameter
  • 这是完全随机的随机字符串,例如 $randomParameter = "randomParameter" :P 我认为在这种情况下没关系 ;)
  • 但我不明白为什么 randomParameter 仍未被 Twig 翻译。即使响应不是 XML 而是 HTML,它也应该可以工作。
  • 它有效。真的。只是值和变量名是相同的;)
  • 我为你做了特别的编辑。现在,值和变量是不同的。

标签: php xml symfony


【解决方案1】:

如果您有许多 XmlResponse 要返回,请考虑创建自己的 Response 对象:

<?php

namespace App\Component\HttpFoundation;

use Symfony\Component\HttpFoundation\Response;

class XmlResponse extends Response
{
    public function __construct(?string $content = '', int $status = 200, array $headers = [])
    {
        parent::__construct($content, $status, array_merge($headers, [
            'Content-Type' => 'text/xml',
        ]));
    }
}

然后您可以在控制器中返回 new XmlResponse($xmlBody);

【讨论】:

  • 恕我直言最佳解决方案 - 干净、透明且无代码重复
【解决方案2】:

尝试在响应对象上添加正确的标头,例如:

$response->headers->set('Content-Type', 'text/xml');

否则,请在您的 Controller 方法上添加正确的注释 (defaults),如下例所示:

 /**
  * @Route("/hello/{name}", defaults={"_format"="xml"}, name="_demo_hello")
  * @Template()
  */
  public function helloAction($name)
  {
     return array('name' => $name);
  }

Look at the guide for further explaination

【讨论】:

  • 嗨@user3766478,如果您觉得我的回答有用,请考虑支持我的回答
  • 我从来没有对默认值的 _format 属性感到陌生——我以前总是不得不取消对模板的注释,因为我需要使用响应对象。感谢您指出!
  • @vladkras 如果你使用注解 xml 就足够了。
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2019-01-04
  • 2013-09-20
  • 1970-01-01
相关资源
最近更新 更多