我正在开发一个小型ZF2应用程序,它为客户端提供了一些API端点.它通过JSON返回一些简单的数据.
它有一个FooController
扩展BaseRestController
和AbstractRestfulController
:
FooController extends BaseRestController { // .... public function getList() { $data = array('foo' => 'bar'); return $this->send($data); } }
和:
BaseRestController extends AbstractRestfulController { // ... public function send($data) { return new JsonModel($data); } }
现在我想根据用户的选择通过XML返回相同的数据.我想我必须在我的send()
方法中做这样的事情BaseRestController
:
if ($format === 'json') { return new JsonModel($data); } else { return new XmlModel($data); }
我查看了内置的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格式的结构化数据吗?
应该有另一种选择,我想学习并了解实现这一目标的正确方法是什么?
如果您只想在一个操作中使用它,则不需要xmlModel.
只需将您的数据转换为正确的XML,然后:
$response = new \Zend\Http\Response(); $response->getHeaders()->addHeaderLine('Content-Type', 'text/xml; charset=utf-8'); $response->setContent($xml); return $response;