ADR Lightning Talk

ADR Lightning Talk

Action Domain Responder Lightning Talk at Webnesday in November 2014

13e697fec58c64352ac63984db062cdf?s=128

Robert Vogt

November 05, 2014
Tweet

Transcript

  1. Action Domain Responder A web-specific refinement of MVC

  2. First off… Robert Vogt Frontend Engineer @ Namics @_deniaz

  3. «Frankly a lot of the reason for this is that

    parts of classic MVC don't really make sense for rich clients these days.» Martin Fowler
  4. Presentation Objects Domain Objects Dispatcher Controller View Model MVC Recap

  5. MVC Recap 1.  Strong separation between presentation (controllers and views)

    and domain (model) 2.  Divide UI widgets into controller (input handling) and view (state representation) 3.  View and controller observe model to allow multiple widgets to update without direct communication
  6. MVC in the wild So why not just go with

    MVC then?
  7. ADR Dispatcher Action Responder Domain 1.  Web handler receives request

    and dispatches to an action 2.  Action interacts with domain 3.  Action feeds data to responder 4.  Responder builds response using the data fed by action 5.  Web handler sends response to client
  8. MVC vs ADR Model  <-­‐>  Domain   View  <-­‐>  Responder

      Controller  <-­‐>  Action  
  9. MVC Example Tree Controllers/          BlogController.php  #

     index(),  create(),  read(),  update(),  delete()   Models/          BlogModel.php   Views/          blog/                  index.html.php                  index.json.php                  create.html.php                  read.html.php                  read.json.php                  update.html.php                  delete.html.php                  _comments.html.php                  _comments.json.php  
  10. MVC class  BlogController  extends  Controller   {      

       public  function  create()          {                  if  ($this-­‐>request-­‐>isPost())  {                          $data  =  $this-­‐>request-­‐>getPost(‘blog’);                          $blog  =  new  BlogModel($data);                                                    if  ($blog-­‐>isValid())  {                                  $blog-­‐>save();                                  $this-­‐>response-­‐>redirect(‘/blog/edit/{$blog-­‐>id}’);                                  return;                          }  else  {                                  $this-­‐>response-­‐>setContent($this-­‐>view-­‐>render(                                          ‘create.html.php’,                                          array(‘blog’  =>  $blog);                                  ));                                  return;                          }                  }  else  {                          $this-­‐>response-­‐>setContent($this-­‐>view-­‐>render(                                  ‘create.html.php’,                                  array(‘blog’  =>  $this-­‐>blogModel-­‐>getDefault());                          ));                  }          }   }  
  11. ADR Example Tree Action/          BlogIndexAction.php  

           BlogCreateAction.php          BlogReadAction.php          BlogUpdateAction.php          BlogDeleteAction.php   Domain/  #  Model,  Gateway,  Mapper,  Entity,  Collection,  Service   Responder/          BlogIndexResponder.php          BlogCreateResponder.php          BlogReadResponder.php          BlogUpdateResponder.php          BlogDeleteResponder.php          html/                  index.html.php                  create.html.php                  read.html.php                  update.html.php                  delete.html.php                  _comments.html.php          json/                  index.json.php                  read.json.php                  _comments.json.php  
  12. ADR class  BlogCreateAction  extends  Action   {      

       public  function  __invoke()          {                  if  ($this-­‐>request-­‐>isPost())  {                          $data  =  $this-­‐>request-­‐>getPost(‘blog’);                          $blog  =  new  BlogModel($data);                                                    if  ($blog-­‐>isValid())  {                                  $blog-­‐>save();                          }                  }  else  {                          $blog  =  $this-­‐>blogModel-­‐>getDefault();                  }                  $this-­‐>responder-­‐>setData(array(‘blog’  =>  $blog));                  $this-­‐>responder-­‐>__invoke();          }   }  
  13. ADR class  BlogCreateResponder  extends  Responder   {      

       public  function  __invoke()          {                  if  ($this-­‐>data-­‐>blog-­‐>id)  {                          $this-­‐>response-­‐>setRedirect(‘/blog/edit/{$blog-­‐>id}’);                  }  else  {                          $this-­‐>response-­‐>setContent($this-­‐>view-­‐>render(                                  ‘create.html.php’,                                  $this-­‐>data                          ));                  }          }   }  
  14. Benefits and Drawbacks + -

  15. More? •  ADR Code Example git.io/pjpMhA •  ADR Blog/Text git.io/0LfZMQ

    •  Aura Framework git.io/RQjLkw •  Paul M. Jones @pmjones @_deniaz