SlideShare a Scribd company logo
Alloy Framework
                            PHP 5.3+ Modular Hierarchical MVC
                            http://alloyframework.org




Wednesday, March 30, 2011
Who am I?
              Vance Lucas
                    http://vancelucas.com
                    @vlucas
                    Business: http://actridge.com
              PHP dev since 1999 (PHP 3)


              I love good OOP code and concepts, but hate the
              complexity it brings


   Vance Lucas (@vlucas)           http://alloyframework.org   2
Wednesday, March 30, 2011
A Few Points...
         Kind of a disclaimer, but not really




Wednesday, March 30, 2011
You May NOT Like Alloy If...
              You are an Object-Oriented Programming Purist
              You don’t care how complex code is as long as it’s
              “correct” OOP (because some guy’s book said so)
              You LOVE using Zend Framework, Symfony, or FLOW3
              You LOVE XML and Dependency Injection Containers
              You are looking for a component library




   Vance Lucas (@vlucas)        http://alloyframework.org    4
Wednesday, March 30, 2011
You MIGHT Like Alloy If...
              You think frameworks like Zend, Symfony, or FLOW3
              make some things too difficult and cumbersome
              You don’t think any PHP framework has it quite right
              You don’t like “too much magic”
              You want to know what your framework is doing
              You value ease of use over everything else
              You want good OOP code that follows known coding
              standards that is still easy to use and understand


   Vance Lucas (@vlucas)        http://alloyframework.org    5
Wednesday, March 30, 2011
Philosophy
              Usefulness, Simplicity and Strong Design
                    Minimum code, maximum impact
              Use OOP principles and design, but don’t over-do it
                    PHP is not Java with dollar signs
              Explicitness > “Magic”
                    Easier to understand & see what is going on
              Design patterns should never trump user experience or
              get in the way
              Users over “correctness”
   Vance Lucas (@vlucas)            http://alloyframework.org     6
Wednesday, March 30, 2011
Alloy Framework Goals
              Lightweight
              Modular Organization
              Hierarchical MVC (HMVC)
              Easy to understand and use
              Easy to make REST APIs and HTML pages
              No config/setup necessary, works anywhere
              Follow PEAR/Zend Coding Standards
              Strike a balance between good OOP concepts
              and ease of use with low learning curve
   Vance Lucas (@vlucas)      http://alloyframework.org   7
Wednesday, March 30, 2011
Alloy Architecture
         Inside & Out




Wednesday, March 30, 2011
Alloy Architecture Overview
              Modular Organization
              Kernel
              Plugins
              Hierarchical MVC (HMVC)
              Controllers as Resources
              Events and Filters




   Vance Lucas (@vlucas)           http://alloyframework.org   9
Wednesday, March 30, 2011
Modular Organization
                                      All related files in a single
                                      top-level named folder
                                      No separate “controllers”,
                                      “models” and “views”
                                      directories at same level
                                      Unlimited levels of nesting
                                      Easier distributable
                                      packages



   Vance Lucas (@vlucas)    http://alloyframework.org       10
Wednesday, March 30, 2011
Kernel

              Core object available from anywhere in your app
                    Kernel() - only global-scope function in Alloy
              Multiple uses:
                    Config access
                    Lazy-loading Factory / Service Locator
                    Extension Point for Modules and Plugins
                    Sole Dependency

   Vance Lucas (@vlucas)            http://alloyframework.org     11
Wednesday, March 30, 2011
Kernel - Config Access
              Getter




              Setter




   Vance Lucas (@vlucas)    http://alloyframework.org   12
Wednesday, March 30, 2011
Kernel - Lazy-Load Factory
              Write This:




              Not That:


              Or This:




   Vance Lucas (@vlucas)    http://alloyframework.org   13
Wednesday, March 30, 2011
Kernel - Extension Point

              Proxies to callbacks added at runtime via __call




              Enables all kinds of custom functionality
                    Factory methods for loading & using 3rd party libs
                    Exposing plugin methods for global use
                    Helper or utility methods

   Vance Lucas (@vlucas)            http://alloyframework.org    14
Wednesday, March 30, 2011
Plugins
         The primary way of extending Alloy




Wednesday, March 30, 2011
Plugin - Symfony2 Finder
              File: app/Plugin/Finder/Plugin.php
              Libs: app/Plugin/Finder/lib/Symfony/Component/ ...




              Add finder method to Kernel for use

   Vance Lucas (@vlucas)      http://alloyframework.org   16
Wednesday, March 30, 2011
Plugin - Add to Config
              File: app/config/app.php




   Vance Lucas (@vlucas)     http://alloyframework.org   17
Wednesday, March 30, 2011
Plugin - Usage
              Use finder method on Kernel instance




   Vance Lucas (@vlucas)      http://alloyframework.org   18
Wednesday, March 30, 2011
Hierarchical MVC
         Solves the “widget problem”




Wednesday, March 30, 2011
Hierarchical MVC
              Multiple MVC dispatches to fulfill a single request
              Solves the “widget problem”
                    Sidebar content can be self-contained module
                            Ads, tag clouds, blog headlines, etc.
                    Encourages module re-use & helps DRY
              Not strictly “hierarchical” - more like nested
                    Hierarchy is not tracked or enforced in any way



   Vance Lucas (@vlucas)                 http://alloyframework.org   20
Wednesday, March 30, 2011
Vance Lucas (@vlucas)    http://alloyframework.org   21
Wednesday, March 30, 2011
Vance Lucas (@vlucas)    http://alloyframework.org   22
Wednesday, March 30, 2011
Controllers
         Respond to both internal and external requests




Wednesday, March 30, 2011
Controllers
              Part of the Module package that handles requests
              Special name “scope” for web-accessible actions
                    GET = <action>Action
                    POST, PUT, DELETE, etc = <action>Method
                    Ensures HTTP methods are required for access
              AlloyRequest object is first parameter
              All named params from route set on Request object



   Vance Lucas (@vlucas)         http://alloyframework.org   24
Wednesday, March 30, 2011
Controllers (cont’d)
              NOTHING is automatically or implicitly loaded
                    No views, models, or anything else
              Explicitly return response or content to send
              Controllers are not factories
                    Controllers are extremely lightweight
              Controllers do not hold the context of their requests




   Vance Lucas (@vlucas)           http://alloyframework.org   25
Wednesday, March 30, 2011
Example REST Controller
              Notice <name>Action vs <name>Method




   Vance Lucas (@vlucas)    http://alloyframework.org   26
Wednesday, March 30, 2011
Controller Response Types
         Sending output and manipulating control flow




Wednesday, March 30, 2011
Simple Strings
              Sends 200 OK status with string content as body




   Vance Lucas (@vlucas)       http://alloyframework.org   28
Wednesday, March 30, 2011
Any object with __toString
              Sends 200 OK status with string content as body




   Vance Lucas (@vlucas)       http://alloyframework.org   29
Wednesday, March 30, 2011
View Templates
              Most common Module response type
              Returns object - template not yet rendered




   Vance Lucas (@vlucas)       http://alloyframework.org   30
Wednesday, March 30, 2011
Resource Objects
              Auto-converts array to JSON or XML for API response
              Accepts objects with toArray methods




   Vance Lucas (@vlucas)      http://alloyframework.org   31
Wednesday, March 30, 2011
Generic Response
              Body + HTTP Status
              Base AlloyModuleResponse that view templates and
              resources extend from
                    Can set custom layout, errors, headers, etc. using a
                    fluent interface just like templates and resources




   Vance Lucas (@vlucas)           http://alloyframework.org     32
Wednesday, March 30, 2011
Boolean False
              Generic 404 (Throws AlloyExceptionFileNotFound)
                    Plugins can filter on ‘dispatch_exception’ event to
                    produce a custom global response




   Vance Lucas (@vlucas)            http://alloyframework.org    33
Wednesday, March 30, 2011
Why Explicit Returns?
         Easier to manipulate responses and control flow




Wednesday, March 30, 2011
Easier to re-use Actions
              Re-use form template from ‘newAction’
              No forwarding or other indirection necessary
              Object return lets you modify it further before display
              through fluent interface




   Vance Lucas (@vlucas)         http://alloyframework.org     35
Wednesday, March 30, 2011
Modify Dispatches at Will
              Template object returned is not yet rendered so we
              can modify it at will
                    Change path to a local template
                    Change layout
                    Add errors
                    Change response code or headers, etc.
              Very flexible



   Vance Lucas (@vlucas)            http://alloyframework.org   36
Wednesday, March 30, 2011
... Even pull out values
              Since the template is not yet rendered, we can even
              pull out values that have been set and re-use them
              however we want to
              We don’t even have to render the dispatch result at all
                    No wasted resources




   Vance Lucas (@vlucas)          http://alloyframework.org   37
Wednesday, March 30, 2011
URL Routing
         Simple named parameters, full control




Wednesday, March 30, 2011
Parameter Types
              <:alpha>
                    Matches [a-zA-Z0-9_-+%s]+
              <#numeric>
                    Matches [0-9]+
              <*wildcard>
                    Marches .*


              Does NOT split the URL by “segment”

   Vance Lucas (@vlucas)             http://alloyframework.org   39
Wednesday, March 30, 2011
Some Default Routes
              Fluent interface allows route modification
              REST verb params will override defaults and matches
                    POST /module/add => Module::postMethod




   Vance Lucas (@vlucas)         http://alloyframework.org   40
Wednesday, March 30, 2011
Custom Routes
              Can be literally anything
                    URL does not have to map <controller>/<action>


              Example from Autoridge.com
                    /<#year>/<:make>/<:model>




   Vance Lucas (@vlucas)          http://alloyframework.org   41
Wednesday, March 30, 2011
Static Routes
              Map arbitrary static path to Module::action
              No PREG matching overhead
              Path can include slashes and be as long as necessary
                    Router does not split URL into segments




   Vance Lucas (@vlucas)           http://alloyframework.org   42
Wednesday, March 30, 2011
Making an App
         HTML + JSON API, single Controller method




Wednesday, March 30, 2011
app/Module/Blog/Post.php

              Using Spot ORM (Ships with Alloy, but NOT required)
              Spot provided with a plugin, not tied to Alloy in any way




   Vance Lucas (@vlucas)        http://alloyframework.org     44
Wednesday, March 30, 2011
Blog Example
              app/Module/Blog/Controller.php




   Vance Lucas (@vlucas)     http://alloyframework.org   45
Wednesday, March 30, 2011
app/Module/Blog/views/index.html.php




   Vance Lucas (@vlucas)    http://alloyframework.org   46
Wednesday, March 30, 2011
http://localhost/path/blog




   Vance Lucas (@vlucas)    http://alloyframework.org   47
Wednesday, March 30, 2011
Magic Datagrid?
              Alloy has View Generics
                    Extensions of view templates
                    Generic HTML template markup with custom
                    functions that accept Closures to enable fully
                    custom PHP markup in designated areas (like table
                    cells) with no special syntax or recursive includes
              You don’t have to use them, but they can be huge
              time-savers if you do




   Vance Lucas (@vlucas)           http://alloyframework.org     48
Wednesday, March 30, 2011
Adding an API
              Template for HTML, Resource object for API




   Vance Lucas (@vlucas)       http://alloyframework.org   49
Wednesday, March 30, 2011
http://localhost/path/blog/index.json

              Array -> JSON via Resource response type




   Vance Lucas (@vlucas)      http://alloyframework.org   50
Wednesday, March 30, 2011
API Errors?




   Vance Lucas (@vlucas)    http://alloyframework.org   51
Wednesday, March 30, 2011
HTML




                       JSON


   Vance Lucas (@vlucas)      http://alloyframework.org   52
Wednesday, March 30, 2011
Layouts & Blocks
         Make your App Look Nice




Wednesday, March 30, 2011
Layouts
              Really just another view template with a special location
              Includes both header & footer, content placed inside




   Vance Lucas (@vlucas)        http://alloyframework.org     54
Wednesday, March 30, 2011
Blocks
              Named regions that content can be pushed to from
              any view template in your app
              Static to current request so no data has to be passed




   Vance Lucas (@vlucas)       http://alloyframework.org    55
Wednesday, March 30, 2011
app/layouts/app.html.php




   Vance Lucas (@vlucas)    http://alloyframework.org   56
Wednesday, March 30, 2011
app/Module/Blog/views/viewAction.html.php

              Post tag list in layout sidebar




   Vance Lucas (@vlucas)         http://alloyframework.org   57
Wednesday, March 30, 2011
app/Module/Blog/views/viewAction.html.php




              HMVC dispatches as “widgetized” content
              Promotes better code re-use, DRY principle, allows
              polymorphic associations for generic types of content
   Vance Lucas (@vlucas)       http://alloyframework.org    58
Wednesday, March 30, 2011
Events & Filters
         Dynamic Behavior & Manipulating Responses




Wednesday, March 30, 2011
Layout Plugin
              Layout wrapping is achieved with a plugin in Alloy
                    Filters ‘dispatch_content’ event




   Vance Lucas (@vlucas)            http://alloyframework.org   60
Wednesday, March 30, 2011
Main Dispatch Content Filter




              Many other events and filters not shown in this diagram
   Vance Lucas (@vlucas)       http://alloyframework.org    61
Wednesday, March 30, 2011
Layout Plugin - wrapLayout
              Returns template wrapped in template




   Vance Lucas (@vlucas)       http://alloyframework.org   62
Wednesday, March 30, 2011
Thanks!
              Alloy on the web:
                    http://alloyframework.org
                    http://github.com/alloyphp


              Vance Lucas
                    Personal: http://vancelucas.com
                    Business: http://actridge.com



   Vance Lucas (@vlucas)           http://alloyframework.org   63
Wednesday, March 30, 2011

More Related Content

PPTX
Apache Maven supports ALL Java (Javaland 2019)
PDF
FuelPHP - a PHP HMVC Framework by silicongulf.com
PDF
Intro to DooPHP
PPTX
PHP framework difference
PPTX
Plugin architecture (Extensible Application Architecture)
PPT
How to learn to build your own PHP framework
PPT
Framework Design Guidelines
PDF
Seven Steps to Creating a Framework
Apache Maven supports ALL Java (Javaland 2019)
FuelPHP - a PHP HMVC Framework by silicongulf.com
Intro to DooPHP
PHP framework difference
Plugin architecture (Extensible Application Architecture)
How to learn to build your own PHP framework
Framework Design Guidelines
Seven Steps to Creating a Framework

Similar to Alloy HMVC PHP Framework (20)

PPTX
Apache Solr-Webinar
PDF
Cross-Platform Mobile Development with Titanium
PPTX
Mocking the unmockable with Moles
PDF
Positioning Yourself for the Future
PDF
Indexing Text and HTML Files with Solr
PDF
Indexing Text and HTML Files with Solr
PDF
Indexing Text and HTML Files with Solr
PDF
An introduction to Storm Crawler
PPTX
Introduction to Lucene and Solr - 1
PDF
Why Laravel?
PPTX
2010 E Learning Ft Worth
PPTX
Software Patterns
PPTX
Developing Agile Java Applications using Spring tools
PDF
New Perspectives on XML Comprehensive 3rd Edition Carey Solutions Manual
PPT
Omeka: Cost-Effective Web Publishing for Museums in a Web 2.0 World
PPT
ApacheCon NA 2011 report
PDF
LyonJUG - Maven 3.x, will it live up to its promises?
PPTX
PL/SQL Interview Questions
PPTX
Linq to xml
PDF
Customising Oracle's eBusiness Suite
Apache Solr-Webinar
Cross-Platform Mobile Development with Titanium
Mocking the unmockable with Moles
Positioning Yourself for the Future
Indexing Text and HTML Files with Solr
Indexing Text and HTML Files with Solr
Indexing Text and HTML Files with Solr
An introduction to Storm Crawler
Introduction to Lucene and Solr - 1
Why Laravel?
2010 E Learning Ft Worth
Software Patterns
Developing Agile Java Applications using Spring tools
New Perspectives on XML Comprehensive 3rd Edition Carey Solutions Manual
Omeka: Cost-Effective Web Publishing for Museums in a Web 2.0 World
ApacheCon NA 2011 report
LyonJUG - Maven 3.x, will it live up to its promises?
PL/SQL Interview Questions
Linq to xml
Customising Oracle's eBusiness Suite
Ad

More from Vance Lucas (7)

PDF
How to Evaluate Your App Idea
PDF
How to Build a Tech Community
PDF
Bullet: The Functional PHP Micro-Framework
PDF
Stackbox CMS: Next-Generation Content Management
PPTX
Object Oriented Apologetics
PPT
PHP - Procedural To Object-Oriented
PPT
Building Data Mapper PHP5
How to Evaluate Your App Idea
How to Build a Tech Community
Bullet: The Functional PHP Micro-Framework
Stackbox CMS: Next-Generation Content Management
Object Oriented Apologetics
PHP - Procedural To Object-Oriented
Building Data Mapper PHP5
Ad

Recently uploaded (20)

PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Approach and Philosophy of On baking technology
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Encapsulation theory and applications.pdf
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
MIND Revenue Release Quarter 2 2025 Press Release
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Machine learning based COVID-19 study performance prediction
Digital-Transformation-Roadmap-for-Companies.pptx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Reach Out and Touch Someone: Haptics and Empathic Computing
Approach and Philosophy of On baking technology
Mobile App Security Testing_ A Comprehensive Guide.pdf
NewMind AI Weekly Chronicles - August'25 Week I
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Per capita expenditure prediction using model stacking based on satellite ima...
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Network Security Unit 5.pdf for BCA BBA.
20250228 LYD VKU AI Blended-Learning.pptx
Building Integrated photovoltaic BIPV_UPV.pdf
Encapsulation theory and applications.pdf
Programs and apps: productivity, graphics, security and other tools
The Rise and Fall of 3GPP – Time for a Sabbatical?
Encapsulation_ Review paper, used for researhc scholars
MIND Revenue Release Quarter 2 2025 Press Release

Alloy HMVC PHP Framework

  • 1. Alloy Framework PHP 5.3+ Modular Hierarchical MVC http://alloyframework.org Wednesday, March 30, 2011
  • 2. Who am I? Vance Lucas http://vancelucas.com @vlucas Business: http://actridge.com PHP dev since 1999 (PHP 3) I love good OOP code and concepts, but hate the complexity it brings Vance Lucas (@vlucas) http://alloyframework.org 2 Wednesday, March 30, 2011
  • 3. A Few Points... Kind of a disclaimer, but not really Wednesday, March 30, 2011
  • 4. You May NOT Like Alloy If... You are an Object-Oriented Programming Purist You don’t care how complex code is as long as it’s “correct” OOP (because some guy’s book said so) You LOVE using Zend Framework, Symfony, or FLOW3 You LOVE XML and Dependency Injection Containers You are looking for a component library Vance Lucas (@vlucas) http://alloyframework.org 4 Wednesday, March 30, 2011
  • 5. You MIGHT Like Alloy If... You think frameworks like Zend, Symfony, or FLOW3 make some things too difficult and cumbersome You don’t think any PHP framework has it quite right You don’t like “too much magic” You want to know what your framework is doing You value ease of use over everything else You want good OOP code that follows known coding standards that is still easy to use and understand Vance Lucas (@vlucas) http://alloyframework.org 5 Wednesday, March 30, 2011
  • 6. Philosophy Usefulness, Simplicity and Strong Design Minimum code, maximum impact Use OOP principles and design, but don’t over-do it PHP is not Java with dollar signs Explicitness > “Magic” Easier to understand & see what is going on Design patterns should never trump user experience or get in the way Users over “correctness” Vance Lucas (@vlucas) http://alloyframework.org 6 Wednesday, March 30, 2011
  • 7. Alloy Framework Goals Lightweight Modular Organization Hierarchical MVC (HMVC) Easy to understand and use Easy to make REST APIs and HTML pages No config/setup necessary, works anywhere Follow PEAR/Zend Coding Standards Strike a balance between good OOP concepts and ease of use with low learning curve Vance Lucas (@vlucas) http://alloyframework.org 7 Wednesday, March 30, 2011
  • 8. Alloy Architecture Inside & Out Wednesday, March 30, 2011
  • 9. Alloy Architecture Overview Modular Organization Kernel Plugins Hierarchical MVC (HMVC) Controllers as Resources Events and Filters Vance Lucas (@vlucas) http://alloyframework.org 9 Wednesday, March 30, 2011
  • 10. Modular Organization All related files in a single top-level named folder No separate “controllers”, “models” and “views” directories at same level Unlimited levels of nesting Easier distributable packages Vance Lucas (@vlucas) http://alloyframework.org 10 Wednesday, March 30, 2011
  • 11. Kernel Core object available from anywhere in your app Kernel() - only global-scope function in Alloy Multiple uses: Config access Lazy-loading Factory / Service Locator Extension Point for Modules and Plugins Sole Dependency Vance Lucas (@vlucas) http://alloyframework.org 11 Wednesday, March 30, 2011
  • 12. Kernel - Config Access Getter Setter Vance Lucas (@vlucas) http://alloyframework.org 12 Wednesday, March 30, 2011
  • 13. Kernel - Lazy-Load Factory Write This: Not That: Or This: Vance Lucas (@vlucas) http://alloyframework.org 13 Wednesday, March 30, 2011
  • 14. Kernel - Extension Point Proxies to callbacks added at runtime via __call Enables all kinds of custom functionality Factory methods for loading & using 3rd party libs Exposing plugin methods for global use Helper or utility methods Vance Lucas (@vlucas) http://alloyframework.org 14 Wednesday, March 30, 2011
  • 15. Plugins The primary way of extending Alloy Wednesday, March 30, 2011
  • 16. Plugin - Symfony2 Finder File: app/Plugin/Finder/Plugin.php Libs: app/Plugin/Finder/lib/Symfony/Component/ ... Add finder method to Kernel for use Vance Lucas (@vlucas) http://alloyframework.org 16 Wednesday, March 30, 2011
  • 17. Plugin - Add to Config File: app/config/app.php Vance Lucas (@vlucas) http://alloyframework.org 17 Wednesday, March 30, 2011
  • 18. Plugin - Usage Use finder method on Kernel instance Vance Lucas (@vlucas) http://alloyframework.org 18 Wednesday, March 30, 2011
  • 19. Hierarchical MVC Solves the “widget problem” Wednesday, March 30, 2011
  • 20. Hierarchical MVC Multiple MVC dispatches to fulfill a single request Solves the “widget problem” Sidebar content can be self-contained module Ads, tag clouds, blog headlines, etc. Encourages module re-use & helps DRY Not strictly “hierarchical” - more like nested Hierarchy is not tracked or enforced in any way Vance Lucas (@vlucas) http://alloyframework.org 20 Wednesday, March 30, 2011
  • 21. Vance Lucas (@vlucas) http://alloyframework.org 21 Wednesday, March 30, 2011
  • 22. Vance Lucas (@vlucas) http://alloyframework.org 22 Wednesday, March 30, 2011
  • 23. Controllers Respond to both internal and external requests Wednesday, March 30, 2011
  • 24. Controllers Part of the Module package that handles requests Special name “scope” for web-accessible actions GET = <action>Action POST, PUT, DELETE, etc = <action>Method Ensures HTTP methods are required for access AlloyRequest object is first parameter All named params from route set on Request object Vance Lucas (@vlucas) http://alloyframework.org 24 Wednesday, March 30, 2011
  • 25. Controllers (cont’d) NOTHING is automatically or implicitly loaded No views, models, or anything else Explicitly return response or content to send Controllers are not factories Controllers are extremely lightweight Controllers do not hold the context of their requests Vance Lucas (@vlucas) http://alloyframework.org 25 Wednesday, March 30, 2011
  • 26. Example REST Controller Notice <name>Action vs <name>Method Vance Lucas (@vlucas) http://alloyframework.org 26 Wednesday, March 30, 2011
  • 27. Controller Response Types Sending output and manipulating control flow Wednesday, March 30, 2011
  • 28. Simple Strings Sends 200 OK status with string content as body Vance Lucas (@vlucas) http://alloyframework.org 28 Wednesday, March 30, 2011
  • 29. Any object with __toString Sends 200 OK status with string content as body Vance Lucas (@vlucas) http://alloyframework.org 29 Wednesday, March 30, 2011
  • 30. View Templates Most common Module response type Returns object - template not yet rendered Vance Lucas (@vlucas) http://alloyframework.org 30 Wednesday, March 30, 2011
  • 31. Resource Objects Auto-converts array to JSON or XML for API response Accepts objects with toArray methods Vance Lucas (@vlucas) http://alloyframework.org 31 Wednesday, March 30, 2011
  • 32. Generic Response Body + HTTP Status Base AlloyModuleResponse that view templates and resources extend from Can set custom layout, errors, headers, etc. using a fluent interface just like templates and resources Vance Lucas (@vlucas) http://alloyframework.org 32 Wednesday, March 30, 2011
  • 33. Boolean False Generic 404 (Throws AlloyExceptionFileNotFound) Plugins can filter on ‘dispatch_exception’ event to produce a custom global response Vance Lucas (@vlucas) http://alloyframework.org 33 Wednesday, March 30, 2011
  • 34. Why Explicit Returns? Easier to manipulate responses and control flow Wednesday, March 30, 2011
  • 35. Easier to re-use Actions Re-use form template from ‘newAction’ No forwarding or other indirection necessary Object return lets you modify it further before display through fluent interface Vance Lucas (@vlucas) http://alloyframework.org 35 Wednesday, March 30, 2011
  • 36. Modify Dispatches at Will Template object returned is not yet rendered so we can modify it at will Change path to a local template Change layout Add errors Change response code or headers, etc. Very flexible Vance Lucas (@vlucas) http://alloyframework.org 36 Wednesday, March 30, 2011
  • 37. ... Even pull out values Since the template is not yet rendered, we can even pull out values that have been set and re-use them however we want to We don’t even have to render the dispatch result at all No wasted resources Vance Lucas (@vlucas) http://alloyframework.org 37 Wednesday, March 30, 2011
  • 38. URL Routing Simple named parameters, full control Wednesday, March 30, 2011
  • 39. Parameter Types <:alpha> Matches [a-zA-Z0-9_-+%s]+ <#numeric> Matches [0-9]+ <*wildcard> Marches .* Does NOT split the URL by “segment” Vance Lucas (@vlucas) http://alloyframework.org 39 Wednesday, March 30, 2011
  • 40. Some Default Routes Fluent interface allows route modification REST verb params will override defaults and matches POST /module/add => Module::postMethod Vance Lucas (@vlucas) http://alloyframework.org 40 Wednesday, March 30, 2011
  • 41. Custom Routes Can be literally anything URL does not have to map <controller>/<action> Example from Autoridge.com /<#year>/<:make>/<:model> Vance Lucas (@vlucas) http://alloyframework.org 41 Wednesday, March 30, 2011
  • 42. Static Routes Map arbitrary static path to Module::action No PREG matching overhead Path can include slashes and be as long as necessary Router does not split URL into segments Vance Lucas (@vlucas) http://alloyframework.org 42 Wednesday, March 30, 2011
  • 43. Making an App HTML + JSON API, single Controller method Wednesday, March 30, 2011
  • 44. app/Module/Blog/Post.php Using Spot ORM (Ships with Alloy, but NOT required) Spot provided with a plugin, not tied to Alloy in any way Vance Lucas (@vlucas) http://alloyframework.org 44 Wednesday, March 30, 2011
  • 45. Blog Example app/Module/Blog/Controller.php Vance Lucas (@vlucas) http://alloyframework.org 45 Wednesday, March 30, 2011
  • 46. app/Module/Blog/views/index.html.php Vance Lucas (@vlucas) http://alloyframework.org 46 Wednesday, March 30, 2011
  • 47. http://localhost/path/blog Vance Lucas (@vlucas) http://alloyframework.org 47 Wednesday, March 30, 2011
  • 48. Magic Datagrid? Alloy has View Generics Extensions of view templates Generic HTML template markup with custom functions that accept Closures to enable fully custom PHP markup in designated areas (like table cells) with no special syntax or recursive includes You don’t have to use them, but they can be huge time-savers if you do Vance Lucas (@vlucas) http://alloyframework.org 48 Wednesday, March 30, 2011
  • 49. Adding an API Template for HTML, Resource object for API Vance Lucas (@vlucas) http://alloyframework.org 49 Wednesday, March 30, 2011
  • 50. http://localhost/path/blog/index.json Array -> JSON via Resource response type Vance Lucas (@vlucas) http://alloyframework.org 50 Wednesday, March 30, 2011
  • 51. API Errors? Vance Lucas (@vlucas) http://alloyframework.org 51 Wednesday, March 30, 2011
  • 52. HTML JSON Vance Lucas (@vlucas) http://alloyframework.org 52 Wednesday, March 30, 2011
  • 53. Layouts & Blocks Make your App Look Nice Wednesday, March 30, 2011
  • 54. Layouts Really just another view template with a special location Includes both header & footer, content placed inside Vance Lucas (@vlucas) http://alloyframework.org 54 Wednesday, March 30, 2011
  • 55. Blocks Named regions that content can be pushed to from any view template in your app Static to current request so no data has to be passed Vance Lucas (@vlucas) http://alloyframework.org 55 Wednesday, March 30, 2011
  • 56. app/layouts/app.html.php Vance Lucas (@vlucas) http://alloyframework.org 56 Wednesday, March 30, 2011
  • 57. app/Module/Blog/views/viewAction.html.php Post tag list in layout sidebar Vance Lucas (@vlucas) http://alloyframework.org 57 Wednesday, March 30, 2011
  • 58. app/Module/Blog/views/viewAction.html.php HMVC dispatches as “widgetized” content Promotes better code re-use, DRY principle, allows polymorphic associations for generic types of content Vance Lucas (@vlucas) http://alloyframework.org 58 Wednesday, March 30, 2011
  • 59. Events & Filters Dynamic Behavior & Manipulating Responses Wednesday, March 30, 2011
  • 60. Layout Plugin Layout wrapping is achieved with a plugin in Alloy Filters ‘dispatch_content’ event Vance Lucas (@vlucas) http://alloyframework.org 60 Wednesday, March 30, 2011
  • 61. Main Dispatch Content Filter Many other events and filters not shown in this diagram Vance Lucas (@vlucas) http://alloyframework.org 61 Wednesday, March 30, 2011
  • 62. Layout Plugin - wrapLayout Returns template wrapped in template Vance Lucas (@vlucas) http://alloyframework.org 62 Wednesday, March 30, 2011
  • 63. Thanks! Alloy on the web: http://alloyframework.org http://github.com/alloyphp Vance Lucas Personal: http://vancelucas.com Business: http://actridge.com Vance Lucas (@vlucas) http://alloyframework.org 63 Wednesday, March 30, 2011

Editor's Notes