A new Hierarchical MVC framework for PHP 5.3+ with a modular organization and REST-centered architecture. Alloy strikes a balance between well-structured and well designed object-oriented code that adheres to the best programming practices and code that is truly simple and enjoyable for programmers who use it on a daily basis.
This talk focuses on introducing Alloy Framework, its philosophies and concepts, why it is Hierarchal MVC and what that means for you as a developer, and showing how easy it is to build an app with both HTML output and a full REST API using a single controller.
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
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
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
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
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
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