Как вернуть 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);
    }
}