I tried Zend_Controller_Router_Route to implemented RESTful URI pattern. But, it is easier to use Zend_Rest_Route and Zend_Rest_Controller. Actually, Zend_Rest_Controller does nothing but defines several abstract methods, which map to relevant HTTP methods. But, our RESTful controller must extend from it. Below is the sample codes. In my environment, I can access it with this URL: http://localhost/jiaRESTfulWS/public/index/product/fish/number/100/
BootStrap class
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { //adding this function in Bootstrap class to initilize Zend_Rest_Route. protected function _initRestRoute() { //getting an instance of zend front controller. $frontController = Zend_Controller_Front::getInstance (); //initializing a Zend_Rest_Route $restRoute = new Zend_Rest_Route ( $frontController ); //let all actions to use Zend_Rest_Route. $frontController->getRouter ()->addRoute ( 'default', $restRoute ); } }
IndexController.php
class IndexController extends Zend_Rest_Controller { public function init() { $this->getHelper ( 'viewRenderer' )->setNoRender ( true ); } /** * The index action handles index/list requests; it should respond with a * list of the requested resources. */ public function indexAction() { //HTTP code 500 might not good choice here. $this->getResponse ()->setHttpResponseCode ( 500 ); $this->getResponse ()->appendBody ( "no list/index allowed" ); } /** * The get action handles GET requests and receives an 'id' parameter; it * should respond with the server resource state of the resource identified * by the 'id' value. */ public function getAction() { //I will return result in XML format. $this->getResponse ()->setHeader ( 'Content-Type', 'text/xml' ); //Note: the Request object here is not HttpRequest. It is Zend controller request. This is the key! if ($this->getRequest ()->getParam ( "product" ) != NULL and $this->getRequest ()->getParam ( "number") != NULL ) { //Initializing a dummy object for return. $return = new Jia_Return (); $return->setProducts ( $this->getRequest ()->getParam ( "product" ) ); $return->setQuantity ( $this->getRequest ()->getParam ( "number" ) ); //We prevent the product has been found. //So, we set HTTP code 200 here. $this->getResponse ()->setHttpResponseCode ( 200 ); } else { $return= new Jia_ErrorCode('no parameters!'); //prevent the product is not found. $this->getResponse ()->setHttpResponseCode ( 200 ); } print $this->_handleStruct( $return ); } /** * The post action handles POST requests; it should accept and digest a * POSTed resource representation and persist the resource state. */ public function postAction() { } /** * The put action handles PUT requests and receives an 'id' parameter; it * should update the server resource state of the resource identified by * the 'id' value. */ public function putAction() { } /** * The delete action handles DELETE requests and receives an 'id' * parameter; it should update the server resource state of the resource * identified by the 'id' value. */ public function deleteAction() { } /** * Handle an array or object result * * @param array|object $struct Result Value * @return string XML Response */ protected function _handleStruct($struct) { $dom = new DOMDocument ( '1.0', 'UTF-8' ); $root = $dom->createElement ( "Jia" ); $method = $root; $root->setAttribute ( 'generator', 'Yiyu Blog' ); $root->setAttribute ( 'version', '1.0' ); $dom->appendChild ( $root ); $this->_structValue ( $struct, $dom, $method ); $struct = ( array ) $struct; if (! isset ( $struct ['status'] )) { $status = $dom->createElement ( 'status', 'success' ); $method->appendChild ( $status ); } return $dom->saveXML (); } /** * Recursively iterate through a struct * * Recursively iterates through an associative array or object's properties * to build XML response. * * @param mixed $struct * @param DOMDocument $dom * @param DOMElement $parent * @return void */ protected function _structValue($struct, DOMDocument $dom, DOMElement $parent) { $struct = ( array ) $struct; foreach ( $struct as $key => $value ) { if ($value === false) { $value = 0; } elseif ($value === true) { $value = 1; } if (ctype_digit ( ( string ) $key )) { $key = 'key_' . $key; } if (is_array ( $value ) || is_object ( $value )) { $element = $dom->createElement ( $key ); $this->_structValue ( $value, $dom, $element ); } else { $element = $dom->createElement ( $key ); $element->appendChild ( $dom->createTextNode ( $value ) ); } $parent->appendChild ( $element ); } } }Return.php
/** * A dummy class as return objec. * * @author Yiyu Jia * */ class Jia_Return { /** * * @var unknown_type */ public $products; public $quantity; /** * @return the $products */ public function getProducts() { return $this->products; } /** * @param $products the $products to set */ public function setProducts($products) { $this->products = $products; } /** * @return the $quantity */ public function getQuantity() { return $this->quantity; } /** * @param $quantity the $quantity to set */ public function setQuantity($quantity) { $this->quantity = $quantity; } }
ErrorCode.php
/** * An dummy error code class. * * @author Yiyu Jia * */ class Jia_ErrorCode { public $errorCode; function __construct($errMsg){ $this->errorCode = $errMsg; } }
ZendStudio 7.2 project file can be downloaded from here.
Thanks for good tutorial !!
ReplyDeleteits not showing project folder on my browser
ReplyDelete