Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ADR Lightning Talk

Robert Vogt
November 05, 2014

ADR Lightning Talk

Action Domain Responder Lightning Talk at Webnesday in November 2014

Robert Vogt

November 05, 2014
Tweet

More Decks by Robert Vogt

Other Decks in Programming

Transcript

  1. «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
  2. 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
  3. 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
  4. 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  
  5. 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());                          ));                  }          }   }  
  6. 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  
  7. 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();          }   }  
  8. 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                          ));                  }          }   }  
  9. More? •  ADR Code Example git.io/pjpMhA •  ADR Blog/Text git.io/0LfZMQ

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