0

I am creating an application where I need all all actions of the framework to output data as XML.

How can this be achieved?

4

1 に答える 1

2

これを実現するには、いくつかの方法があります。

1afterExecuteRouteイベントを実施する

    class MyController extends Phalcon\Mvc\Controller
    {
        public function showAsXml1Action()
        {
            return "<root><key>k</key></root";
        }

        public function showAsXml2Action()
        {
            return "<root><key>k</key></root";
        }

        public function afterExecuteRoute($dispatcher)
        {
            $response = new Phalcon\Http\Response();
            $response->setHeader('Content-Type', 'application/xml');
            $response->setContent($dispatcher->getReturnedValue());
            $dispatcher->setReturnedValue($response);
        }
    }

2 XML 応答を処理するクラスを作成します。

    class MyXMLResponse extends Phalcon\Http\Response
    {
        public function __construct($xml)
        {
            $this->setHeader('Content-Type', 'application/xml');
            $this->setContent($xml);
        }
    }

コントローラーで:

    public function showAsXml2Action()
    {
        return MyXmlResponse("<root><key>k</key></root");
    }

3 XML 応答を処理するプラグインを作成します。

    class MyController extends Phalcon\Mvc\Controller
    {
        public function showAsXml1Action()
        {
            return array(
                "type"    => "xml",
                "content" => "<root><key>k</key></root",
            );
        } 
    }

プラグイン:

    class ContentTypePlugin extends \Phalcon\Mvc\User\Plugin
    {
        public function afterExecuteRoute($event, $dispatcher)
        {
            $content = $dispatcher->getReturnedValue();

            switch ($content['type']) {
                case 'xml':
                    $response = new Phalcon\Http\Response();
                    $response->setHeader('Content-Type', 'application/xml');
                    $response->setContent($content['content']);
                    $dispatcher->setReturnedValue($response);    
                    break;
            }
        }
    }
  1. 注釈の使用

    /**
     * @Response(type="xml")
     */
    public function showAction()
    {
        return "<root><key>k</key></root";
    }
    

プラグイン:

    class AnnotationsContentPlugin extends \Phalcon\Mvc\User\Plugin
    {
        public function afterExecuteRoute($event, $dispatcher)
        {
            $annotations = $this->annotations->getMethod(
                $dispatcher->getActiveController(),
                $dispatcher->getActiveMethod()
            );

            // Check if the method has an annotation 'Response'
            if ($annotations->has('Response')) {

               // Get the type
                $type = $annotations->get('Response')
                                    ->getNamedParameter('type');

                if ($type == 'xml') {
                    $response = new Phalcon\Http\Response();
                    $response->setHeader('Content-Type', 'application/xml');
                    $response->setContent($dispatcher->getReturnedValue());
                    $dispatcher->setReturnedValue($response);    
                }
            }
        }
    }

次のような XML 出力にファイル階層を使用する必要がある場合:

app/views/index.phtml
app/views/layouts/posts.phtml
app/views/posts/show.phtml

アクションで次のコードを使用できます

    public function showAction()
    {
        $this->view->setRenderLevel(Phalcon\Mvc\View::LEVEL_ACTION_VIEW);
        $this->view->xml = '<root><key>k</key></root>';
    }

そしてビューで:

<?php echo $xml; ?>
于 2013-05-31T20:14:07.967 に答える