Zend framework service
Upcoming SlideShare
Loading in...5
×
 

Zend framework service

on

  • 2,746 views

Us a single API layer and use Zend Framework to provide all kinds of services (xml-rpc, json, soap, csv, …)

Us a single API layer and use Zend Framework to provide all kinds of services (xml-rpc, json, soap, csv, …)

Statistics

Views

Total Views
2,746
Views on SlideShare
2,661
Embed Views
85

Actions

Likes
2
Downloads
41
Comments
0

3 Embeds 85

http://mvandam.com 61
http://localhost 13
http://www.mvandam.com 11

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Zend framework service Zend framework service Presentation Transcript

  • Zend Framework“at your service” Michelangelo van Dam Dutch PHP Conference 2011 Amsterdam (NL)
  • Why a service ?•- opening up existing API internal applications - external applications - additional functionality• support to more devices• portability and flexibility
  • Important components• - Zend_Soap Zend_Soap_Server - Zend_Soap_Client - Zend_Soap_Wsdl• Zend_Rest - Zend_Rest_Server - Zend_Rest_Client• Zend_XmlRpc - Zend_XmlRpc_Server - Zend_XmlRpc_Client - Zend_XmlRpc_Request - Zend_XmlRpc_Response
  • Example service•- Time registration list time sheets - add a new task - edit an existing task - delete an existing task
  • MVC approach•- time module controllers (for displaying listing and forms) - actions (for listing, adding, editing and deleting) - models (for access to database) - forms (for filtering, validation and rendering forms)
  • Common behavior• all “logic” is put in the controller• actions = API interface•- downside not flexible towards other clients - difficult to provide maintenance - not reusable design
  • Time Module Time_IndexController indexAction editAction- lists registered tasks - displays a form- links to the form - for adding task - for adding task - for editing task - for editing task - for deleting task registerAction deleteAction- processes form data - deletes task - validating data - storing data in db
  • API Design•- moving logic out the controller - in an API class• structures the application• is better testable• is better maintainable
  • Time API My_Api_Timesheet listTasks registerNewTask- lists registered tasks - for adding task editExistingTask deleteExistingTask- for modifying task - deletes task
  • Simple ?
  • API output channels Web Internal SOAP XML API XMLRPC JSON … REST
  • Timesheet API
  • DocBlocks are important!•- DocBlocks are very important ! provide quality API documentation - can be used as reference for the server !!!
  • My_Api_Timesheet <?phpclass My_Api_Timesheet{}
  • listTasks/** * List all tasks for a given user * * @param int $user * @return array */public function listTasks($user){ $array = array (); $timesheet = new Time_Model_Timesheet(); if (null !== ($result = $timesheet->fetchAll(array ( user_id = ? => $user, ), array (date DESC, start_time ASC)))) { foreach ($result as $entry) { $array[] = $entry->toArray(); } } return $array;}
  • registerNewTask/** * Register a new task * * @param int $user The ID of the user * @param int $customer The ID of the customer * @param int $task The ID of the task * @param string $date A date formatted as YYYY-mm-dd * @param string $start The starting time as HH:mm:ss * @param string $end The ending time as HH:mm:ss * @param string $description A short description * @return bool TRUE if registration succeeded * @throws My_Api_Timesheet_Exception */
  • registerNewTaskpublic function registerNewTask( $user, $customer, $task, $date, $start, $end, $description){ $timesheet = new Time_Model_Timesheet(); $timesheet->setUserId($user) ->setCustomerId($customer) ->setTaskId($task) ->setDate($date) ->setStartTime($start) ->setEndTime($end) ->setDescription($description); $validator = $this->_validate($timesheet); if (false === $validator) { require_once My/Api/Timesheet/Exception.php; throw new My_Api_Timesheet_Exception(Invalid data provided); } $timesheet->save(); return true;}
  • editExistingTask /*** Modify an existing task** @param int $id The ID of an existing Task* @param int $user The ID of the user* @param int $customer The ID of the customer* @param int $task The ID of the task* @param string $date A date formatted as YYYY-mm-dd* @param string $start The starting time as HH:mm:ss* @param string $end The ending time as HH:mm:ss* @param string $description A short description* @return bool TRUE if registration succeeded* @throws My_Api_Timesheet_Exception*/
  • editExistingTask public function editExistingTask( $id, $user, $customer, $task, $date, $start, $end, $description){ $timesheet = new Time_Model_Timesheet(); $timesheet->setId($id) ->setUserId($user) ->setCustomerId($customer) ->setTaskId($task) ->setDate($date) ->setStartTime($start) ->setEndTime($end) ->setDescription($description); $validator = $this->_validate($timesheet); if (false === $validator) { require_once My/Api/Timesheet/Exception.php; throw new My_Api_Timesheet_Exception(Invalid data provided); } $timesheet->save(); return true;}
  • deleteExistingTask /** * Modify an existing task * * @param int $id The ID of an existing Task * @param int $user The ID of the user * @return bool TRUE if registration succeeded * @throws My_Api_Timesheet_Exception */public function deleteExistingTask($id, $user){ $timesheet = new Time_Model_Timesheet(); $timesheet->setId($id) ->setUserId($user); $validator = $this->_validate($timesheet); if (false === $validator) { require_once My/Api/Timesheet/Exception.php; throw new My_Api_Timesheet_Exception(Invalid data provided); } $timesheet->delete(array ( id = ? => $timesheet->getId(), user_id = ? => $timesheet->getUserId(), )); return true;}
  • _validate /** * Private validation method * * @param Time_Model_Timesheet $timesheet * @return bool TRUE if validated, FALSE if invalid */private function _validate(Time_Model_Timesheet $timesheet){ $result = true; $validator = new Time_Form_Register(); $customer = new Time_Model_Customer(); $task = new Time_Model_Task(); $validator->getElement(customer_id)->setMultiOptions($customer->toSelect()); $validator->getElement(task_id)->setMultiOptions($task->toSelect()); if (!$validator->isValid($timesheet->toArray())) { $result = false; } return $result;}
  • Zend_XmlRpc
  • XmlRpc Server <?phpclass Time_XmlRpcController extends Zend_Controller_Action{ public function indexAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); require_once My/Api/Timesheet.php; $server = new Zend_XmlRpc_Server(); $server->setClass(My_Api_Timesheet); echo $server->handle(); }}
  • Zend_Soap
  • SOAP Server <?phpclass Time_SoapController extends Zend_Controller_Action{ public function indexAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); $options = array (); $server = new Zend_Soap_AutoDiscover(); $server->setClass(My_Api_Timesheet); $server->handle(); }}
  • SOAP Client <?phpclass Time_SoapClientController extends Zend_Controller_Action{ protected $_client; public function init() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); $this->_client = new Zend_Soap_Client( http://www.demo.local/Time/soap?wsdl, array ()); } public function indexAction() { Zend_Debug::dump($this->_client->listTasks(2)); } public function addAction() { Zend_Debug::dump($this->_client->registerNewTask( 2, 2, 3, 2010-03-30, 18:00:00, 23:30:00,Setting up SOAP)); } public function editAction() { Zend_Debug::dump($this->_client->editExistingTask( 7, 2, 2, 3, 2010-03-30, 18:00:00, 23:30:00,Testing SOAP)); } public function deleteAction() { Zend_Debug::dump($this->_client->deleteExistingTask(7, 2)); }}
  • Zend_Rest
  • REST Server <?phpclass Time_RestController extends Zend_Controller_Action{ public function indexAction() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); $server = new Zend_Rest_Server(); $server->setClass(My_Api_Timesheet); $server->handle(); }}
  • REST Client <?phpclass Time_RestClientController extends Zend_Controller_Action{ protected $_client; public function init() { $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); $this->_client = new Zend_Rest_Client(http://www.demo.local/Time/rest); } public function indexAction() { $this->_client->listTasks(2); Zend_Debug::dump($this->_client->get()); }}
  • Patterns ???
  • Conclusionmoving functionality out the controller into a library API = saves time1 api = XmlRpc + SOAP + REST + …
  • You can help !•- find a bug ? test it - report it - send a patch/fix• need a non-existing component - submit proposal• like Zend Framework - blog about it - talk about it
  • ZF Bug hunt days Zend Framework Bughuntdays every 3rd Thursday and Friday of the month http://framework.zend.com/issues IRC (irc.freenode.net) #zftalk.dev prizes:Free subscription for 1 year on php|Architect magazine Zend Framework t-shirt recognition and appreciation of the community
  • ZF issue tracker
  • phpbenelux.eu PHP BENELUX
  • daycamp4developers.comProject Management Late August - Early September
  • Thank you ! Slides on SlideshareGive feedback on Joind.in http://joind.in/3473