Zend Framework应用程序内容转换为xml的插件

最新Zend Framework应用程序内容转换为xml的插件

以下是三零网为大家整理的最新Zend Framework应用程序内容转换为xml的插件的文章,希望大家能够喜欢!

在这一篇博文中Thijs Feryn通过实现Zend_Controller_Plugin_Abstract的hook方法,在原程序没有使用context switching控制器助手的情况下,将返回的内容响应转为为特定的XML格式



代码:

<?php 
/** 
* My_Plugin_Xml component 
* Turns an Zend Framework MVC website into an XML webservice 
* File From Liehuo.Net
*/ 
/** 
* My_Plugin_Xml class 

* @author Thijs Feryn <[email protected]
*/ 
class My_Plugin_Xml extends Zend_Controller_Plugin_Abstract 

/** 
* Stores the front controller 

* @var Zend_Controller_Front 
*/ 
private $_front; 
/** 
* Stores the XML output in DOMDocument format 

* @var DOMDocument 
*/ 
private $_xml; 
/** 
* Class constructor 
*/ 
public function __construct() 

$this->_front = Zend_Controller_Front::getInstance(); 
$layout = Zend_Layout::getMvcInstance(); 
$layout->disableLayout(); 

/** 
* Build DOMDocument to convert output to XML 

* @param mixed $return 
* @param Exception $exception 
* @return string 
*/ 
private function _getXML($return = null,Exception $exception = null) 

$this->_xml = new DOMDocument('1.0', 'UTF-8'); 
$this->_xml->formatOutput = true;

$responseNode = $this->_xml->createElement('response');

$exceptionNode = $this->_xml->createElement('exception'); 
if(null !== $exception && $exception instanceof Exception ){ 
$exceptionNode->appendChild( 
$this->_xml->createElement('message', 
$exception->getMessage() 

); 
$exceptionNode->appendChild( 
$this->_xml->createElement('code', 
$exception->getCode() 

); 
$exceptionNode->appendChild( 
$this->_xml->createElement('type', 
get_class($exception) 

); 
}

$responseNode->appendChild($exceptionNode); 
if(null !== $return){ 
$responseNode->appendChild( 
$this->_serialize('return',$return) 
); 
} else { 
$responseNode->appendChild( 
$this->_xml->createElement('return') 
); 
}

$this->_xml->appendChild($responseNode); 
return $this->_xml->saveXML(); 

/** 
* Modify the HTTP response object 
* Remove the HTML body, replace with XML and change the content-type 

* @param mixed $return 
* @param Exception $exception 
*/ 
private function _setResponse($return = false,Exception $exception = null) 

$this->getResponse()->setHeader('Content-Type','text/xml; charset=UTF-8'); 
$this->getResponse()->clearBody(); 
$this->getResponse()->setBody( 
$this->_getXML($return,$exception) 
); 

/** 
* Serialize a mixed value to XML in DOMElement format 
* This method can be used recursively in case of objects and arrays 

* @param string $name 
* @param mixed $value 
* @return DOMElement 
*/ 
private function _serialize($name,$value) 

if(is_array($value)){ 
$element = $this->_xml->createElement($name); 
foreach ($value as $k=>$v){ 
if(is_numeric($k)){ 
$k = 'item'; 

$element->appendChild($this->_serialize($k,$v)); 

} elseif(is_object($value)){ 
$element = $this->_xml->createElement($name); 
$reflection = new ReflectionObject($value); 
$properties = $reflection->getProperties(); 
foreach ($properties as $property){ 
if($property->isPublic()){ 
$element->appendChild( 
$this->_serialize( 
$property->getName(), 
$property->getValue($value) 

); 


}else{ 
$element = $this->_xml->createElement( 
$name, 
(string)$value 
); 

return $element; 

/** 
* preDispatch hook that retrieves if an Exception was thrown in the application 
* If an exception is thrown, the exception is passed to the exception part of the XML output and script execution is terminated 

* @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(); 


/** 
* postDispatch hook that serializes the view object to XML by modifying the HTTP response 
* If no exception was thrown script execution continues and the postDispatch method will be called 

* @param Zend_Controller_Request_Abstract $request 
*/ 
public function postDispatch(Zend_Controller_Request_Abstract $request) 

$view = Zend_Controller_Action_HelperBroker::getExistingHelper('ViewRenderer')->view; 
$this->_setResponse($view); 


_getXML()产生特定的xml结构 
_setResponse()设置响应的xml内容 
_serialize()将返回的对象序列化为xml(使用递归) 
preDispatch()判断是否有异常,如果有则只设置异常并终止脚本执行 
postDispatch()返回响应

转载来自:http://www.q3060.com/list3/list117/17306.html

你可能感兴趣的:(文章,控制器,应用程序)