在Zend Framework 2应用程序中返回XML响应的正确方法是什么?

edi*_*igu 2 xml api rest zend-framework2

我正在开发一个小型ZF2应用程序,它为客户端提供了一些API端点.它通过JSON返回一些简单的数据.

它有一个FooController扩展BaseRestControllerAbstractRestfulController:

FooController extends BaseRestController
{
    // ....
    public function getList()
    {
        $data = array('foo' => 'bar');
        return $this->send($data);
    }
 }
Run Code Online (Sandbox Code Playgroud)

和:

BaseRestController extends AbstractRestfulController
{
    // ...
    public function send($data)
    {
        return new JsonModel($data);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想根据用户的选择通过XML返回相同的数据.我想我必须在我的send()方法中做这样的事情BaseRestController:

if ($format === 'json') {
    return new JsonModel($data);
} else {
    return new XmlModel($data);
}
Run Code Online (Sandbox Code Playgroud)

我查看了内置的JsonModel,它扩展Zend\View\Model\ViewModel并添加了serialize()将变量序列化为JSON的方法.

我想我必须写一个类似的XmlModel,但我无法弄清楚如何正确编写这个模型,以及告诉我的控制器这个新模型的正确方法是什么.

要实现这一目标需要哪些类/工厂/渲染器/策略?

我阅读了文档的创建和注册备用渲染和响应策略部分,但是所有现有解决方案都检查了Accept HTTP标头,我不需要与标头交互,客户端只需将所需格式作为路由参数传递到我的应用程序中,/rest/foo?format=json或者/rest/foo?format=xml

我还在bitbucket上找到了Netglue扩展,他们写了5个不同的Mvc服务类加上3个其他模型/渲染器/策略总共8个类,这听起来对我来说太过分了.

真正的问题是,真正需要编写八种不同的类来转换和返回XML格式的结构化数据吗?

应该有另一种选择,我想学习并了解实现这一目标的正确方法是什么?

Exl*_*ord 7

如果您只想在一个操作中使用它,则不需要xmlModel.
只需将您的数据转换为正确的XML,然后:

$response = new \Zend\Http\Response();
$response->getHeaders()->addHeaderLine('Content-Type', 'text/xml; charset=utf-8');
$response->setContent($xml);
return $response;
Run Code Online (Sandbox Code Playgroud)