alloy hmvc php framework

63
Alloy Framework PHP 5.3+ Modular Hierarchical MVC http://alloyframework.org Wednesday, March 30, 2011

Upload: vance-lucas

Post on 13-Apr-2017

13.554 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Alloy HMVC PHP Framework

Alloy FrameworkPHP 5.3+ Modular Hierarchical MVC

http://alloyframework.org

Wednesday, March 30, 2011

Page 2: Alloy HMVC PHP Framework

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

Page 3: Alloy HMVC PHP Framework

A Few Points...Kind of a disclaimer, but not really

Wednesday, March 30, 2011

Page 4: Alloy HMVC PHP Framework

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

Page 5: Alloy HMVC PHP Framework

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

Page 6: Alloy HMVC PHP Framework

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

Page 7: Alloy HMVC PHP Framework

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

Page 8: Alloy HMVC PHP Framework

Alloy ArchitectureInside & Out

Wednesday, March 30, 2011

Page 9: Alloy HMVC PHP Framework

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

Page 10: Alloy HMVC PHP Framework

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

Page 11: Alloy HMVC PHP Framework

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

Page 12: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

Kernel - Config AccessGetter

Setter

12

Wednesday, March 30, 2011

Page 13: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

Kernel - Lazy-Load FactoryWrite This:

Not That:

Or This:

13

Wednesday, March 30, 2011

Page 14: Alloy HMVC PHP Framework

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

Page 15: Alloy HMVC PHP Framework

PluginsThe primary way of extending Alloy

Wednesday, March 30, 2011

Page 16: Alloy HMVC PHP Framework

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

Page 17: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

Plugin - Add to ConfigFile: app/config/app.php

17

Wednesday, March 30, 2011

Page 18: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

Plugin - UsageUse finder method on Kernel instance

18

Wednesday, March 30, 2011

Page 19: Alloy HMVC PHP Framework

Hierarchical MVCSolves the “widget problem”

Wednesday, March 30, 2011

Page 20: Alloy HMVC PHP Framework

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

Page 21: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org 21

Wednesday, March 30, 2011

Page 22: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org 22

Wednesday, March 30, 2011

Page 23: Alloy HMVC PHP Framework

ControllersRespond to both internal and external requests

Wednesday, March 30, 2011

Page 24: Alloy HMVC PHP Framework

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

Page 25: Alloy HMVC PHP Framework

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

Page 26: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

Example REST ControllerNotice <name>Action vs <name>Method

26

Wednesday, March 30, 2011

Page 27: Alloy HMVC PHP Framework

Controller Response TypesSending output and manipulating control flow

Wednesday, March 30, 2011

Page 28: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

Simple StringsSends 200 OK status with string content as body

28

Wednesday, March 30, 2011

Page 29: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

Any object with __toStringSends 200 OK status with string content as body

29

Wednesday, March 30, 2011

Page 30: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

View TemplatesMost common Module response type

Returns object - template not yet rendered

30

Wednesday, March 30, 2011

Page 31: Alloy HMVC PHP Framework

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

Page 32: Alloy HMVC PHP Framework

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

Page 33: Alloy HMVC PHP Framework

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

Page 34: Alloy HMVC PHP Framework

Why Explicit Returns?Easier to manipulate responses and control flow

Wednesday, March 30, 2011

Page 35: Alloy HMVC PHP Framework

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

Page 36: Alloy HMVC PHP Framework

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

Page 37: Alloy HMVC PHP Framework

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

Page 38: Alloy HMVC PHP Framework

URL RoutingSimple named parameters, full control

Wednesday, March 30, 2011

Page 39: Alloy HMVC PHP Framework

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

Page 40: Alloy HMVC PHP Framework

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

Page 41: Alloy HMVC PHP Framework

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

Page 42: Alloy HMVC PHP Framework

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

Page 43: Alloy HMVC PHP Framework

Making an AppHTML + JSON API, single Controller method

Wednesday, March 30, 2011

Page 44: Alloy HMVC PHP Framework

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

Page 45: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

Blog Exampleapp/Module/Blog/Controller.php

45

Wednesday, March 30, 2011

Page 46: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

app/Module/Blog/views/index.html.php

46

Wednesday, March 30, 2011

Page 47: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

http://localhost/path/blog

47

Wednesday, March 30, 2011

Page 48: Alloy HMVC PHP Framework

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

Page 49: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

Adding an APITemplate for HTML, Resource object for API

49

Wednesday, March 30, 2011

Page 50: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

http://localhost/path/blog/index.json

Array -> JSON via Resource response type

50

Wednesday, March 30, 2011

Page 51: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

API Errors?

51

Wednesday, March 30, 2011

Page 52: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

HTML

JSON

52

Wednesday, March 30, 2011

Page 53: Alloy HMVC PHP Framework

Layouts & BlocksMake your App Look Nice

Wednesday, March 30, 2011

Page 54: Alloy HMVC PHP Framework

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

Page 55: Alloy HMVC PHP Framework

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

Page 56: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

app/layouts/app.html.php

56

Wednesday, March 30, 2011

Page 57: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

app/Module/Blog/views/viewAction.html.php

Post tag list in layout sidebar

57

Wednesday, March 30, 2011

Page 58: Alloy HMVC PHP Framework

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

Page 59: Alloy HMVC PHP Framework

Events & FiltersDynamic Behavior & Manipulating Responses

Wednesday, March 30, 2011

Page 60: Alloy HMVC PHP Framework

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

Page 61: Alloy HMVC PHP Framework

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

Page 62: Alloy HMVC PHP Framework

Vance Lucas (@vlucas) http://alloyframework.org

Layout Plugin - wrapLayoutReturns template wrapped in template

62

Wednesday, March 30, 2011

Page 63: Alloy HMVC PHP Framework

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