Как вернуть XML в приложении Zend Framework - PullRequest
13 голосов
/ 09 октября 2009

У меня проблемы с возвратом 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();
    }
}

Может ли кто-нибудь указать мне правильное направление, как этого достичь?

Ответы [ 2 ]

25 голосов
/ 09 октября 2009

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 отображает как макет, так и шаблон после вашего кода.

Я согласен с Марком, раскладка должна быть отключена, хотя, кроме того, вы должны также отключить представление рендерера. И, безусловно, 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);
    }
}
10 голосов
/ 09 октября 2009

Вам не хватает конечного знака вопроса на теге xml:

<?xml version='1.0'>

должно быть

<?xml version='1.0'?>

Кроме того, вам, вероятно, потребуется отключить макет, чтобы он печатал только xml. Поместите эту строку в ваш метод xmlAction ()

$this->_helper->layout->disableLayout();

Возможно, вы захотите рассмотреть помощник действия contextSwitch

Кроме того, вы можете захотеть использовать DomDocument вместо непосредственного ввода xml

...