このブログ投稿では、Thijs Feryn が Zend_Controller_Plugin_Abstract のフック メソッドを実装して、元のプログラムのコンテキスト スイッチング コントローラー アシスタントを使用せずに、返されたコンテンツ応答を特定の XML 形式に変換します。 /2009/05/converting-your-zend-framework-mvc-application-into-an-xml-webservice-using-one-single-plugin/
コード:
クリップボードにコピー引用コンテンツ: [www.bkjia.com]
/*** My_Plugin_Xml コンポーネント
* Zend Framework MVC Web サイトを XML Web サービスに変換します
* Liehuo.Net からのファイル
*/
/**
* My_Plugin_Xml クラス
*
* @author Thijs Feryn
*/
class My_Plugin_Xml は Zend_Controller_Plugin_Abstract を拡張します
{
/**
* フロントコントローラーを保存します
*
* @var Zend_Controller_Front
*/
private $_front
/**
* XML 出力を DOMDocument 形式で保存します
*
* @var DOMDocument
; */
プライベート $_xml;
/**
* クラスコンストラクター
*/
パブリック関数 __construct()
{
$this->_front = Zend_Controller_Front::getInstance();
$layout = Zend_Layout::getMvcInstance();
$layout->disableLayout();
}
/**
* DOMDocument を構築して出力を XML に変換します
*
* @parammixed $return
* @param Exception $Exception
* @return string
*/
プライベート関数 _getXML($return = null,Exception $例外 = null)
{
$this->_xml = new DOMDocument( '1.0', 'UTF-8');
$this->xml->formatOutput = true;
$responseNode = $this->xml->createElement('response'); = $this->xml->createElement('例外');
if(null !== $例外 && $例外インスタンスオブ例外 ){
$例外ノード->appendChild(
$this->_xml-> ;createElement('メッセージ',
$例外->getMessage()
)
);
$例外ノード->appendChild(
$this->_xml->createElement('コード',
$例外->) ;getCode()
)
);
$ExceptionNode->appendChild(
$this->_xml->createElement('type',
get_class($Exception)
)
}
$responseNode ->appendChild($ExceptionNode);
if(null !== $return){
$responseNode->appendChild(
$this->serialize('return',$return)
);
$responseNode->appendChild(
$this->xml->createElement('return')
);
$this->xml->appendChild($responseNode); ->xml->saveXML();
}
/**
* HTTP 応答オブジェクトを変更します
* HTML 本文を削除し、XML に置き換えて、コンテンツ タイプを変更します
*
* @parammixed $return
* @param Exception $Exception
*/
プライベート関数 _setResponse($return = false,Exception $例外 = null)
{
$this->getResponse()- >setHeader('Content-Type','text/xml; charset=UTF-8');
$this->getResponse()->clearBody(); ;setBody(
$this->_getXML($return,$Exception)
);
/**
* 混合値を DOMElement 形式で XML にシリアル化します
* このメソッドはオブジェクトと配列の場合に再帰的に使用できます
*
* @param string $name
* @parammixed $value
* @return DOMElement
*/
プライベート関数 _serialize($name,$value)
{
if(is_array($) value)){
$element = $this->xml->createElement($name);
foreach ($value as $k=>$v){
if(is_numeric($k)){
$ k = 'アイテム';
$element->appendChild($this->_serialize($k,$v));
}
} elseif(is_object($value)){
$element = $this ->xml->createElement($name);
$reflection = new ReflectionObject($value);
$properties = $reflection->getProperties();
foreach ($property として){
if( $property->isPublic()){
$element->appendChild(
$this->_serialize(
$property->getName(),
$property->getValue($value)
)
);
}
}
}else{
$element = $this->xml->createElement(
$name,
(string)$value
);
return $element
/* *
* アプリケーションで例外がスローされたかどうかを取得する preDispatch フック
* 例外がスローされた場合、例外は XML 出力の例外部分に渡され、スクリプトの実行が終了します
*
* @param Zend_Controller_Request_Abstract $request
*/
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
if( $this->getResponse()->isException()){
$exArray = $this->getResponse()->getException();
$this->setResponse(null,$exArray[0]) );
$this->getResponse()->sendResponse();
exit()
}
/**
* HTTP 応答を変更してビュー オブジェクトを XML にシリアル化する postDispatch フック
* 例外がスローされなかった場合、スクリプトの実行は続行され、postDispatch メソッドが呼び出されます
*
* @param Zend_Controller_Request_Abstract $request
*/
{
$view = Zend_Controller_Action_HelperBroker::getExistingHelper('ViewRenderer')->view;
}
}
_getXML() は特定の XML 構造を生成します
_setResponse() は応答の XML コンテンツを設定します
_serialize() は返されたオブジェクトを (再帰を使用して) XML にシリアル化します
preDispatch() は例外があるかどうかを判断し、例外がある場合は、例外とスクリプト実行の終了
postDispatch() は応答を返します
$this->front->registerPlugin(new My_Plugin_Xml()); を使用して
http://www.bkjia.com/PHPjc/364543.html
www.bkjia.com
true