alloy hmvc php framework
TRANSCRIPT
Alloy FrameworkPHP 5.3+ Modular Hierarchical MVC
http://alloyframework.org
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
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
2
Wednesday, March 30, 2011
A Few Points...Kind of a disclaimer, but not really
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
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
4
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
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
5
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
PhilosophyUsefulness, 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”6
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Alloy Framework GoalsLightweight
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
7
Wednesday, March 30, 2011
Alloy ArchitectureInside & Out
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Alloy Architecture OverviewModular Organization
Kernel
Plugins
Hierarchical MVC (HMVC)
Controllers as Resources
Events and Filters
9
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Modular OrganizationAll 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
10
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
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
11
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Kernel - Config AccessGetter
Setter
12
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Kernel - Lazy-Load FactoryWrite This:
Not That:
Or This:
13
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
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
14
Wednesday, March 30, 2011
PluginsThe primary way of extending Alloy
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Plugin - Symfony2 FinderFile: app/Plugin/Finder/Plugin.php
Libs: app/Plugin/Finder/lib/Symfony/Component/ ...
Add finder method to Kernel for use
16
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Plugin - Add to ConfigFile: app/config/app.php
17
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Plugin - UsageUse finder method on Kernel instance
18
Wednesday, March 30, 2011
Hierarchical MVCSolves the “widget problem”
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Hierarchical MVCMultiple 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
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
ControllersRespond to both internal and external requests
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
ControllersPart 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
Alloy\Request object is first parameter
All named params from route set on Request object
24
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
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
25
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Example REST ControllerNotice <name>Action vs <name>Method
26
Wednesday, March 30, 2011
Controller Response TypesSending output and manipulating control flow
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Simple StringsSends 200 OK status with string content as body
28
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Any object with __toStringSends 200 OK status with string content as body
29
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
View TemplatesMost common Module response type
Returns object - template not yet rendered
30
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Resource ObjectsAuto-converts array to JSON or XML for API response
Accepts objects with toArray methods
31
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Generic ResponseBody + HTTP Status
Base Alloy\Module\Response that view templates and resources extend from
Can set custom layout, errors, headers, etc. using a fluent interface just like templates and resources
32
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Boolean FalseGeneric 404 (Throws Alloy\Exception\FileNotFound)
Plugins can filter on ‘dispatch_exception’ event to produce a custom global response
33
Wednesday, March 30, 2011
Why Explicit Returns?Easier to manipulate responses and control flow
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Easier to re-use ActionsRe-use form template from ‘newAction’
No forwarding or other indirection necessary
Object return lets you modify it further before display through fluent interface
35
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Modify Dispatches at WillTemplate 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
36
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
... Even pull out valuesSince 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
37
Wednesday, March 30, 2011
URL RoutingSimple named parameters, full control
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Parameter Types<:alpha>
Matches [a-zA-Z0-9\_\-\+\%\s]+
<#numeric>
Matches [0-9]+
<*wildcard>
Marches .*
Does NOT split the URL by “segment”
39
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Some Default RoutesFluent interface allows route modification
REST verb params will override defaults and matches
POST /module/add => Module::postMethod
40
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Custom RoutesCan be literally anything
URL does not have to map <controller>/<action>
Example from Autoridge.com
/<#year>/<:make>/<:model>
41
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Static RoutesMap 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
42
Wednesday, March 30, 2011
Making an AppHTML + JSON API, single Controller method
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
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
44
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Blog Exampleapp/Module/Blog/Controller.php
45
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
app/Module/Blog/views/index.html.php
46
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
http://localhost/path/blog
47
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
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
48
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Adding an APITemplate for HTML, Resource object for API
49
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
http://localhost/path/blog/index.json
Array -> JSON via Resource response type
50
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
API Errors?
51
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
HTML
JSON
52
Wednesday, March 30, 2011
Layouts & BlocksMake your App Look Nice
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
LayoutsReally just another view template with a special location
Includes both header & footer, content placed inside
54
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
BlocksNamed 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
55
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
app/layouts/app.html.php
56
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
app/Module/Blog/views/viewAction.html.php
Post tag list in layout sidebar
57
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
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
58
Wednesday, March 30, 2011
Events & FiltersDynamic Behavior & Manipulating Responses
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Layout PluginLayout wrapping is achieved with a plugin in Alloy
Filters ‘dispatch_content’ event
60
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Main Dispatch Content Filter
Many other events and filters not shown in this diagram
61
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Layout Plugin - wrapLayoutReturns template wrapped in template
62
Wednesday, March 30, 2011
Vance Lucas (@vlucas) http://alloyframework.org
Thanks!Alloy on the web:
http://alloyframework.org
http://github.com/alloyphp
Vance Lucas
Personal: http://vancelucas.com
Business: http://actridge.com
63
Wednesday, March 30, 2011