Using ZF2 Components     Shawn Stratton      August 4, 2011
What is Zend Framework 2?  • PHP 5.3 based component library (can be used as a full framework).  • FLOSS (Modified BSD Lice...
Why Use ZF2 Components  • They’re new and shiny (fun to learn).  • Natural upgrade path for ZF1.  • Uses new PHP 5.3 featu...
PHP 5.3 and YouThere are a few things you need to know about PHP 5.3 to understandsome of the concepts in Zend Framework 2...
Namespaces   • Common in other languages, new to PHP as of 5.3.   • We’ve (Community) been doing it in (sort of) using und...
Anonymous Functions & Closures   • Popular in Javascript.   • Closures are the same as anonymous functions but can have ac...
Late Static Binding  • Can resolve current called class in static method.  • Adds several functions and constants.  • So f...
Late Static Binding cont.<?phpclass A {    p u b l i c s t a t i c who ( ) {        echo        CLASS ;    }    public sta...
Lets Meet The Components
List of Components for today  • ZendLoader, New Autoloader  • ZendDi, Dependency Injection Container  • ZendEventManager, ...
ZendLoader
ZF1 AutoloadingHow does autoloading currently work in Zend Framework?  • Works on Registered “Namespaces” such as Zend.  •...
ZF1 Autoloading Example<?phprequire once         Z e n d / Loader / S t a n d a r d A u t o l o a d e r . p h p    ;$ l o ...
So what’s different in ZF2  • Different types of autoloaders (Classmap, PSR0, prefix/namespace    specific autoloading)  • C...
ZF2 Namespace Prefix Autoloading<?phprequire once               Z e n d / Loader / S t a n d a r d A u t o l o a d e r . p ...
ZF2 Class-Map Autoloading<?PHP$map = a r r a y (    M y Foo B a r        =>     DIR      .      / Foo / Bar . p h p   ,);r...
More about ZF2 Class-Map Autoloading  • Yes you will need to create classmaps,  • ZF2 has a tool to generate these for you...
FactoryZendLoader also has a factory that will allow you to quickly assembleyour autoloading strategy and implement it.<?p...
So what are we doing with HowStuffWorks.com  • Well as of right now we still do require/include once statements,    mostly...
So what are we doing with HowStuffWorks.com  • Well as of right now we still do require/include once statements,    mostly...
So what are we doing with HowStuffWorks.com  • Well as of right now we still do require/include once statements,    mostly...
Oh Just a Side Note  • Matthew Weier O‘Phinney has already taken the liberty to package    the ZF2 autoloader as a PHP 5.2...
Oh Just a Side Note  • Matthew Weier O‘Phinney has already taken the liberty to package    the ZF2 autoloader as a PHP 5.2...
ZendDi
What is DI?  • Dependency Injection is just a Construction / Design Pattern,    previously discussed (last month actually)...
What is ZendDi for?  • ZF2 is planning on using Dependency Injection with it’s Controllers    and for provided Services.  ...
Some Details about ZendDi  • Uses dependency maps to do injections.  • These maps can be in php, ini, or xml format (ZendC...
DI Configuration & Locater Example<?phpuse Zend Di  D e f i n i t i o n ,    Zend Di  Reference ,    Zend Di  D e p e n d e...
Setting Injection Example<?phpuse Zend Di  D e f i n i t i o n ,    Zend Di  Reference ;$ s e r v i c e = new D e f i n i ...
Considerations for ZF1 usage  • ZF1 does not play well with Dependency Injection with it’s    components.  • The majority ...
ZendEventManager
What is the EventManager?  • A solution for providing Aspect Oriented Programing principles in    PHP, (crosscutting conce...
But why does that matter?  • Allows for handling events without modifying/overwriting framework    code.  • Allows you to ...
EventCollection Interface<?phpnamespace Zend EventManager ;use Zend S t d l i b  C a l l b a c k H a n d l e r ;interface ...
Triggering Events<?phpuse Zend EventManager  EventManager ;$events = new EventManager ( ) ;$events−>t r i g g e r ( $event...
Zend Components as of ZF2
Just a quick List  • Acl              • Controller     • File  • Amf              • Crypt                                 ...
Just a quick list, cont.   • Layout           • Mvc          • Search     • Translator   • Ldap             • Navigation  ...
There are a bunch of components out    there, choose what you want
How To Convert for PHP 5.2
Let’s be realisticNot all components are convertible, if they require the followingcomponents, PHP 5.2 will not run these:...
Figuring out DependenciesWith PHP 5.3’s namespace aliasing, mapping dependencies actuallybecomes really easy; use statemen...
Converting NamespacesSome sticking points:  • It’s easy to replace the namespace separator with the ZF1 but be    sure to ...
Conclusions  • ZF2 Components are awesome, we can use them in ZF1 Projects    (with a little work).  • ZF2 Components have...
Questions?
Thank YouThank you for attending and a special thank you to Matthew WeierO‘Phinney for letting me use part of his slide st...
Upcoming SlideShare
Loading in...5
×

Zend Framework 2 Components

4,595

Published on

Atlanta

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,595
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
117
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Zend Framework 2 Components

  1. 1. Using ZF2 Components Shawn Stratton August 4, 2011
  2. 2. What is Zend Framework 2? • PHP 5.3 based component library (can be used as a full framework). • FLOSS (Modified BSD License) with Copyright License Agreement. • Corporate Backed by Zend Enterprises. • Chief Architect is Matthew Weier O‘Phinney. 2
  3. 3. Why Use ZF2 Components • They’re new and shiny (fun to learn). • Natural upgrade path for ZF1. • Uses new PHP 5.3 features for better performance & design (newer fancy architecture). • Better quality (built from experience with ZF1). 3
  4. 4. PHP 5.3 and YouThere are a few things you need to know about PHP 5.3 to understandsome of the concepts in Zend Framework 2. These are: • Namespacing. • Anonymous functions and closures. • Late Static Binding. 4
  5. 5. Namespaces • Common in other languages, new to PHP as of 5.3. • We’ve (Community) been doing it in (sort of) using underscores. • Just an organizational tool, denoted be backslashes. • Adds importing and aliasing (think .NET and Java). “use x” and “use x as y”<?phpnamespace Zend Session Storage ;use A r r a y O b j e c t ,Zend Session Storage ,Zend Session E x c e p t i o n ;c l a s s A r r a y S t o r a g e extends A r r a y O b j e c t implements Storage{ /* . . . */ } 5
  6. 6. Anonymous Functions & Closures • Popular in Javascript. • Closures are the same as anonymous functions but can have access to parent scope elements.<?php$var = ’ t e s t ’ ;/ / T h i s i s a c l o s u r e , note t h e use s t a t e m e n t$func = f u n c t i o n ( ) use ( $var ){ echo $var ;};$func ( ) ; 6
  7. 7. Late Static Binding • Can resolve current called class in static method. • Adds several functions and constants. • So far I haven’t seen this used in ZF2 yet, but I wouldn’t be surprised if it makes it into things dealing with modeling and the database. 7
  8. 8. Late Static Binding cont.<?phpclass A { p u b l i c s t a t i c who ( ) { echo CLASS ; } public static test () { s e l f : : who ( ) ; s t a t i c : : who ( ) ; }}c l a s s B extends A { p u b l i c s t a t i c who ( ) { echo CLASS ; }} 8
  9. 9. Lets Meet The Components
  10. 10. List of Components for today • ZendLoader, New Autoloader • ZendDi, Dependency Injection Container • ZendEventManager, PubSubHub style Event Manager (more about what this is later) 10
  11. 11. ZendLoader
  12. 12. ZF1 AutoloadingHow does autoloading currently work in Zend Framework? • Works on Registered “Namespaces” such as Zend. • Takes classname and replaces with / in the classname and adds .php to the end. • Checks the include path for the filename it comes up with, if it exists include it. • Similar to other “1st generation” framework autoloaders. • Can add other “Namespaces”. 12
  13. 13. ZF1 Autoloading Example<?phprequire once Z e n d / Loader / S t a n d a r d A u t o l o a d e r . p h p ;$ l o a d e r = new Zend Loader S t a n d a r d A u t o l o a d e r ( a r r a y ( fallback autoloader => t r u e ,));$loader −>r e g i s t e r ( ) ; 13
  14. 14. So what’s different in ZF2 • Different types of autoloaders (Classmap, PSR0, prefix/namespace specific autoloading) • Can chain “fallback” autoloaders • Higher performance due to direct requests • ZF2 no longer uses require once statements in the source files 14
  15. 15. ZF2 Namespace Prefix Autoloading<?phprequire once Z e n d / Loader / S t a n d a r d A u t o l o a d e r . p h p ;$ l o a d e r = new Zend Loader S t a n d a r d A u t o l o a d e r ( ) ;$loader −>registerNamespace ( My , DIR . / . . / library / M y )−>r e g i s t e r P r e f i x ( P h l y , DIR . / . . / library / P h l y ) ;$loader −>r e g i s t e r ( ) ; 15
  16. 16. ZF2 Class-Map Autoloading<?PHP$map = a r r a y ( M y Foo B a r => DIR . / Foo / Bar . p h p ,);require once Z e n d / Loader / ClassMapAutoloader . p h p ;$ l o a d e r = new Zend Loader ClassMapAutoloader ( ) ;$loader −>r e g i s t e r A u t o l o a d M a p ( D I R . / . . / l i b r a r y / . classmap . p h p ) ;$loader −>r e g i s t e r ( ) ; 16
  17. 17. More about ZF2 Class-Map Autoloading • Yes you will need to create classmaps, • ZF2 has a tool to generate these for you. • Shows significant performance improvement over “include path” autoloaders. • According to the Supreme Allied Commander (Matthew Weier O‘Phiney) Class-Maps show a 25% speed improvement over ZF1 Autoloader and a 60% to 85% improvement with a opcode cache enabled. 17
  18. 18. FactoryZendLoader also has a factory that will allow you to quickly assembleyour autoloading strategy and implement it.<?phprequire once Z e n d / Loader / A u t o l o a d e r F a c t o r y . p h p ;use Zend Loader A u t o l o a d e r F a c t o r y ;AutoloaderFactory : : f a c t o r y ( array ( Z e n d Loader C l a s s M a p A u t o l o a d e r => a r r a y ( DIR . / . . / l i b r a r y / . classmap . p h p , DIR . / . . / a p p l i c a t i o n / . classmap . p h p ,), Z e n d Loader S t a n d a r d A u t o l o a d e r => a r r a y ( n a m e s p a c e s => a r r a y ( Zend => DIR . / . . / library / Zend ,), fallback autoloader => t r u e ,),)); 18
  19. 19. So what are we doing with HowStuffWorks.com • Well as of right now we still do require/include once statements, mostly for performance reasons. 19
  20. 20. So what are we doing with HowStuffWorks.com • Well as of right now we still do require/include once statements, mostly for performance reasons. • We’ve tested ZF2 Class Map autoloading with the PSR0 Fallback using APC and saw 20% performance increase (approx 40ms on the front-end.) 19
  21. 21. So what are we doing with HowStuffWorks.com • Well as of right now we still do require/include once statements, mostly for performance reasons. • We’ve tested ZF2 Class Map autoloading with the PSR0 Fallback using APC and saw 20% performance increase (approx 40ms on the front-end.) • Not in production yet but it is on our roadmap (we have a large code base and it’ll take some time to adapt it all and test it). 19
  22. 22. Oh Just a Side Note • Matthew Weier O‘Phinney has already taken the liberty to package the ZF2 autoloader as a PHP 5.2 compliant package, you can get it http://bit.ly/zf2autoloadfor52 20
  23. 23. Oh Just a Side Note • Matthew Weier O‘Phinney has already taken the liberty to package the ZF2 autoloader as a PHP 5.2 compliant package, you can get it http://bit.ly/zf2autoloadfor52 • I’ve ported this into the ZendX namespace in a PHP 5.3 compliant package, find me later and I’ll get you a copy 20
  24. 24. ZendDi
  25. 25. What is DI? • Dependency Injection is just a Construction / Design Pattern, previously discussed (last month actually). • Pattern outlines that all Dependencies should be passed into an object rather than “retrieved” by said object. • Allows for more flexibility and better testing. • In this case it’s a Dependency Injection Container. • Again it’s just a fancy registry. 22
  26. 26. What is ZendDi for? • ZF2 is planning on using Dependency Injection with it’s Controllers and for provided Services. • Most of the library components do use Dependency Injection as their design pattern. • ZendDi is a construction helper, everything in ZF2 thus far can run without the DI Container (maybe not the locater). 23
  27. 27. Some Details about ZendDi • Uses dependency maps to do injections. • These maps can be in php, ini, or xml format (ZendConfig) • Supports Setter Injection & Lazy Initialization instead of just Constructor Injection. • May support Dynamic Resolution of Dependencies in the future (Reflection) • The container, last I tested, was a bit heavy but I know improvements were being made. 24
  28. 28. DI Configuration & Locater Example<?phpuse Zend Di D e f i n i t i o n , Zend Di Reference , Zend Di D e p e n d e n c y I n j e c t o r as DI ;$db = new D e f i n i t i o n ( ’MyDb Adapter S q l i t e ’ ) ;$db−>setParam ( ’ name ’ , DIR . ’ / . . / data / db / users . db ’ ) ;$mapper = new D e f i n i t i o n ( ’MyMapperDb ’ ) ;$mapper−>addMethodCall ( ’ s e t A d a p t e r ’ , a r r a y ( new Reference ( ’ db ’ ) ) ) ;$ s e r v i c e = new D e f i n i t i o n ( ’My Resource Users ’ ) ;$ s e r v i c e −>setParam ( ’ mapper ’ , new Reference ( ’ mapper ’ ) ) ;$ d i = new DI ;$di−>s e t D e f i n i t i o n s ( a r r a y ( ’ db ’=> $db , ’ mapper ’ => $mapper , ’ users ’=> $ s e r v i c e ) ) ;$users = $di−>g e t ( ’ users ’ ) ; / / My Resource Users 25
  29. 29. Setting Injection Example<?phpuse Zend Di D e f i n i t i o n , Zend Di Reference ;$ s e r v i c e = new D e f i n i t i o n ( ’mwop S e r v i c e Resources ’ ) ;$ s e r v i c e −>addMethod ( ’ setResource ’ , a r r a y ( new Reference ( ’ r e s o u r c e ’ )));$di−>s e t D e f i n i t i o n ( ’ r e s o u r c e s ’ , $ s e r v i c e ) ;$resources = $di−>g e t ( ’ r e s o u r c e s ’ ) ; 26
  30. 30. Considerations for ZF1 usage • ZF1 does not play well with Dependency Injection with it’s components. • The majority of configuration options require arrays and there is some differing structure for these arrays. • Controllers require an inherited constructor (which is why most of the initialization is done in init() ) • Still works good for Service Containers and Data Models 27
  31. 31. ZendEventManager
  32. 32. What is the EventManager? • A solution for providing Aspect Oriented Programing principles in PHP, (crosscutting concerns). • A combination of subject/observer pattern, PubSubHub, and Signal Slots? (wtf is all this?) • A better way of notifying other parts of the system that an event is about to occur/has occured with filters so that we can interact on the event. 29
  33. 33. But why does that matter? • Allows for handling events without modifying/overwriting framework code. • Allows you to create hook points for other parts of the system to interact with at runtime. • It’s a major evolutionary step to Programing Philosophy (ask me more on Aspect Oriented Programing later if you’re interested) 30
  34. 34. EventCollection Interface<?phpnamespace Zend EventManager ;use Zend S t d l i b C a l l b a c k H a n d l e r ;interface EventCollection{ p u b l i c f u n c t i o n t r i g g e r ( $event , $ c o n t e x t , $argv = array ( ) ) ; p u b l i c f u n c t i o n t r i g g e r U n t i l ( $event , $ c o n t e x t , $argv , $ c a l l b a c k ) ; p u b l i c f u n c t i o n a t t a c h ( $event , $ c a l l b a c k , $ p r i o r i t y = 1) ; p u b l i c f u n c t i o n detach ( C a l l b a c k H a n d l e r $handle ) ; p u b l i c f u n c t i o n getEvents ( ) ; p u b l i c f u n c t i o n g e t H a n d l e r s ( $event ) ; p u b l i c f u n c t i o n c l e a r H a n d l e r s ( $event ) ;} 31
  35. 35. Triggering Events<?phpuse Zend EventManager EventManager ;$events = new EventManager ( ) ;$events−>t r i g g e r ( $eventName , $ o b j e c t , $params ) ;/ * Where : * − $eventName i s t h e name o f t h e event ; u s u a l l y t h e current * method name * − $ o b j e c t i s t h e o b j e c t t r i g g e r i n g t h e event * − $params are t h e parameters t h e h a n d l e r might need t o access , * u s u a l l y t h e method arguments */ 32
  36. 36. Zend Components as of ZF2
  37. 37. Just a quick List • Acl • Controller • File • Amf • Crypt • Filter • Application • Currency • Form • Authentication • Date • Barcode • Db • GData • Cache • Debug • Http • Captcha • Di • InfoCard • Code • Dojo • CodeGenerator • Dom • Json • Config • EventManager • ProgressBar • Console • Feed 34
  38. 38. Just a quick list, cont. • Layout • Mvc • Search • Translator • Ldap • Navigation • Service • Uri • Loader • OAuth • Session • Validator • Locale • OpenId • Soap • Log • Paginator • Stdlib • Version • Mail • Pdf • Tag • View • Markup • Queue • Test • Wildfire • Meassure • Reflection • Text • Memory • Registry • TimeSync • XmlRpc • Mime • Rest • Tool 35
  39. 39. There are a bunch of components out there, choose what you want
  40. 40. How To Convert for PHP 5.2
  41. 41. Let’s be realisticNot all components are convertible, if they require the followingcomponents, PHP 5.2 will not run these: • Closures (Anonymous Functions) • Late Static Binding • Garbage Collection 38
  42. 42. Figuring out DependenciesWith PHP 5.3’s namespace aliasing, mapping dependencies actuallybecomes really easy; use statements at the beginning of the file willusually tell you what components you need from outside of thatnamespace. 39
  43. 43. Converting NamespacesSome sticking points: • It’s easy to replace the namespace separator with the ZF1 but be sure to find and replace aliases. • It may be worth renaming the namespace from Zend to ZendX if using Zend Framework 1 to keep from mixing up components. • Be sure you remove all references to namespace, use, as, and from the code, PHP 5.2 will barf on these. 40
  44. 44. Conclusions • ZF2 Components are awesome, we can use them in ZF1 Projects (with a little work). • ZF2 Components have benefits, performance being one, shininess being two. • Integration ZF2 Components now will make refactoring to use ZF2 later easier. • Why Not? The idea behind Zend Framework is to make reusable components (it’s technically a library not a framework), don’t get stuck on legacy library components just because you can’t upgrade your whole stack. 41
  45. 45. Questions?
  46. 46. Thank YouThank you for attending and a special thank you to Matthew WeierO‘Phinney for letting me use part of his slide stack (especially sourcecode) from his ZF2 Patterns talk. 43
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×