twig - 使用循环呈现xml内容(甚至是空内容)

时间:2013-06-18 09:56:14

标签: xml api symfony response twig

我正在构建一个以多种格式呈现内容的Web服务,基本上是json,xml和html(仅用于测试,不用担心)。

JSON和HTML渲染工作正常,我刚刚在我的实体中添加了一个“toArray()”方法来渲染它。 (我猜/希望它是最好/唯一的方式,至少JSON导出?!)

但是我在XML渲染方面遇到了一些麻烦。 (我道歉,但我讨厌那种语言,通常从不将它用于数据导出,但这似乎是这个项目的要求。) 我调用了一个名为MyBundle:MyController:myView.xml.twig的视图,并且出现了一个我无法修复的错误...

  

此页面包含以下错误:

     第1行第2行的

错误:文档末尾的额外内容

     

下面是第一个错误之前的页面呈现。

我在Google上搜索了它,这似乎是一个常见的XML解析错误,但我不知道是什么原因!

更多信息的几行代码......

我的routing.yml路由器文件:

# Prefixed by /api
# The final route will looks like /api/bookings.{_format}
my_bundle_bookingpage:
    pattern:  /bookings.{_format}
    defaults: { _controller: MyBundle:Bookings:index, _format: json }
    requirements:
        _format: json|xml|html
        _method: 'get'

My BookingsController.php:

<?php

namespace My\Bundle\Controller;

class BookingsController extends RestController
{
    public function indexAction()
    {
        $request = $this->getRequest();
        $em = $this->getDoctrine()->getEntityManager();

        $bookings = $em->getRepository('MyCoreBundle:Booking')->findAll();

        $parameters = array(
            'bookings' => $bookings
        );

        switch ($request->get('_format')) {
            case 'html':
            case 'xml':
                return $this->render('MyBundle:Bookings:index.'.$request->get('_format').'.twig', $parameters);
                break;
            default:
                foreach ($parameters['bookings'] as &$booking) {
                    $booking = $booking->toArray();
                }
                return $this->generateJsonResponse($parameters, 200);
                break;
        }
    }
}

还有RestController,它只提供了一个简单的JsonResponse方法:

<?php

namespace My\Bundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;

class RestController extends Controller
{
    public function generateJsonResponse($content = array(), $status = 200)
    {
        $response = new JsonResponse($content, $status);

        return $response;
    }
}

最后,myView.xml:

<bookings>
    {% for booking in bookings %}
        <booking>
            <id>{{ booking.id }}</id>
            <created>{{ booking.createdAt }}</created>
            <updated>{{ booking.updatedAt }}</updated>
            <name>{{ booking.name }}</name>
            <date>{{ booking.datetime }}</date>
            <notes>{{ booking.notes }}</notes>
            <persons>{{ booking.persons }}</persons>
        </booking>
    {% endfor %}
</bookings>

1 个答案:

答案 0 :(得分:2)