Zend Framework应用程序内容转换为xml的插件
发布时间:2020-12-13 20:34:14 所属栏目:PHP教程 来源:网络整理
导读:在这一篇博文中Thijs Feryn通过实现Zend_Controller_Plugin_Abstract的hook方法,在原程序没有使用context switching控制器助手的情况下,将返回的内容响应转为为特定的XML格式 地址:http://blog.feryn.eu/2009/05/converting-your-zend-framework-mvc-appl
在这一篇博文中Thijs Feryn通过实现Zend_Controller_Plugin_Abstract的hook方法,在原程序没有使用context switching控制器助手的情况下,将返回的内容响应转为为特定的XML格式 地址:http://blog.feryn.eu/2009/05/converting-your-zend-framework-mvc-application-into-an-xml-webservice-using-one-single-plugin/ 代码: <?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 <thijs@feryn.eu> */ 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()返回响应 使用方法 $this->_front->registerPlugin(new My_Plugin_Xml()); -------- (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |