I am creating an application where I need all all actions of the framework to output data as XML.
How can this be achieved?
これを実現するには、いくつかの方法があります。
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;
}
}
}
注釈の使用
/**
* @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; ?>