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. Action Domain Responder
    A web-specific refinement of MVC

    View Slide

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

    View Slide

  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

    View Slide

  4. Presentation Objects Domain Objects
    Dispatcher Controller
    View
    Model
    MVC Recap

    View Slide

  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

    View Slide

  6. MVC in the wild
    So why not just go with MVC then?

    View Slide

  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

    View Slide

  8. MVC vs ADR
    Model  <-­‐>  Domain  
    View  <-­‐>  Responder  
    Controller  <-­‐>  Action  

    View Slide

  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  

    View Slide

  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());  
                           ));  
                   }  
           }  
    }  

    View Slide

  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  

    View Slide

  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();  
           }  
    }  

    View Slide

  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  
                           ));  
                   }  
           }  
    }  

    View Slide

  14. Benefits and Drawbacks
    + -

    View Slide

  15. More?
    •  ADR Code Example git.io/pjpMhA
    •  ADR Blog/Text git.io/0LfZMQ
    •  Aura Framework git.io/RQjLkw
    •  Paul M. Jones @pmjones
    @_deniaz

    View Slide