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