Как вернуть XML в приложении Zend Framework
У меня возникают проблемы с возвратом XML в моем приложении ZF.
Мой код:
class ProjectsController extends Gid_Controller_Action
{
public function xmlAction ()
{
$content = "<?xml version='1.0'><foo>bar</foo>";
header('Content-Type: text/xml');
echo $content;
}
}
Я также пробовал следующее:
class ProjectsController extends Gid_Controller_Action
{
public function xmlAction ()
{
$content = "<?xml version='1.0'><foo>bar</foo>";
$this->getResponse()->clearHeaders();
$this->getResponse()->setheader('Content-Type', 'text/xml');
$this->getResponse()->setBody($content);
$this->getResponse()->sendResponse();
}
}
Может ли кто-нибудь указать мне в правильном направлении, как это сделать?
Ответы
Ответ 1
В теге xml отсутствует метка вопроса окончания:
<?xml version='1.0'>
Это должно быть
<?xml version='1.0'?>
Кроме того, вам, вероятно, придется отключить макет, чтобы он печатал только xml. Поместите эту строку в свой метод xmlAction()
$this->_helper->layout->disableLayout();
Возможно, вы захотите рассмотреть помощник действия contextSwitch
Кроме того, вы можете использовать DomDocument вместо непосредственного ввода xml
Ответ 2
UPDATE
По-видимому, Zend Framework предоставляет лучший способ для этого из коробки. Пожалуйста, проверьте документацию ContextSwitch.
Единственное, что вы можете изменить, это принудительный XML-контекст в методе init() контроллера.
<?php
class ProjectsController extends Gid_Controller_Action
{
public function init()
{
$contextSwitch = $this->_helper->getHelper('contextSwitch');
$contextSwitch->addActionContext('xml', 'xml')->initContext('xml');
}
public function xmlAction()
{
}
}
<ч/" > Старый ответ.
Это не работает, потому что ZF отображает как макет, так и шаблон после вашего кода.
Я согласен с Mark, макет должен быть отключен, хотя вы также должны отключить средство визуализации. И определенно DOMDocument гораздо предпочтительнее, когда вы собираетесь иметь дело с XML.
Вот пример контроллера, который должен делать то, что вы хотите:
<?php
class ProjectsController extends Gid_Controller_Action
{
public function xmlAction()
{
// XML-related routine
$xml = new DOMDocument('1.0', 'utf-8');
$xml->appendChild($xml->createElement('foo', 'bar'));
$output = $xml->saveXML();
// Both layout and view renderer should be disabled
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setNoRender(true);
Zend_Layout::getMvcInstance()->disableLayout();
// Set up headers and body
$this->_response->setHeader('Content-Type', 'text/xml; charset=utf-8')
->setBody($output);
}
}