13

ZF アプリケーションで XML を返す際に問題があります。私のコード:

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();
    }
}

誰かがこれを達成する方法を正しい方向に向けることができますか?

4

2 に答える 2

25

アップデート

どうやら、Zend Framework は、すぐに使用できる優れた方法を提供しています。ContextSwitch アクション ヘルパーのドキュメントを確認してください。

変更したい唯一のことは、コントローラーの init() メソッドで XML コンテキストを強制することです。

<?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 はコードの後に​​レイアウトとテンプレートの両方をレンダリングするため、機能しません。

マークに同意します。レイアウトを無効にする必要がありますが、さらにビューレンダラーも無効にする必要があります。そして、XML を扱う場合は、間違いなく DOMDocument の方がはるかに適しています。

これは、あなたが望むことをするサンプルコントローラーです:

<?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);
    }
}
于 2009-10-09T17:11:52.327 に答える
10

xml タグに最後の疑問符がありません:

<?xml version='1.0'>

そのはず

<?xml version='1.0'?>

さらに、おそらくレイアウトを無効にして、xml のみを出力する必要があります。この行を xmlAction() メソッドに入れます

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

contextSwitch アクションヘルパーを検討することをお勧めします

また、xml を直接入力する代わりにDomDocumentを使用することもできます。

于 2009-10-09T16:04:17.577 に答える