Zend Framework 2 Components

Post on 15-Jan-2015

4.253 views 3 download

Tags:

description

Atlanta

Transcript of Zend Framework 2 Components

Using ZF2 Components

Shawn Stratton

August 4, 2011

What is Zend Framework 2?

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.

Why Use ZF2 Components

3

• They’re new and shiny (fun to learn).

• Natural upgrade path for ZF1.

• Uses new PHP 5.3 features for better performance & design (newerfancy architecture).

• Better quality (built from experience with ZF1).

PHP 5.3 and You

4

There 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.

Namespaces

5

• 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 “usex as y”

<?phpnamespace Zend\Session\Storage ;use ArrayObject ,Zend\Session\Storage ,Zend\Session\Except ion ;c lass ArrayStorage extends ArrayObject implements

Storage{ / * . . . * / }

Anonymous Functions & Closures

6

• Popular in Javascript.

• Closures are the same as anonymous functions but can have accessto parent scope elements.

<?php$var = ’ t e s t ’ ;/ / This i s a c losure , note the use statement$func = f u n c t i o n ( ) use ( $var ){

echo $var ;} ;$func ( ) ;

Late Static Binding

7

• 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 surprisedif it makes it into things dealing with modeling and the database.

Late Static Binding cont.

8

<?phpc lass A {

p u b l i c s t a t i c who ( ) {echo CLASS ;

}p u b l i c s t a t i c t e s t ( ) {

s e l f : : who ( ) ;s t a t i c : : who ( ) ;

}}c lass B extends A {

p u b l i c s t a t i c who ( ) {echo CLASS ;

}}

Lets Meet The Components

List of Components for today

10

• Zend\Loader, New Autoloader

• Zend\Di, Dependency Injection Container

• Zend\EventManager, PubSubHub style Event Manager (more aboutwhat this is later)

Zend\Loader

ZF1 Autoloading

12

How 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 existsinclude it.

• Similar to other “1st generation” framework autoloaders.

• Can add other “Namespaces”.

ZF1 Autoloading Example

13

<?phprequ i re once Z e n d / Loader / StandardAutoloader . p h p ;$ loader = new Zend\Loader\StandardAutoloader ( ar ray (

f a l l b a c k a u t o l o a d e r => t rue ,) ) ;$loader−>r e g i s t e r ( ) ;

So what’s different in ZF2

14

• Different types of autoloaders (Classmap, PSR0, prefix/namespacespecific autoloading)

• Can chain “fallback” autoloaders

• Higher performance due to direct requests

• ZF2 no longer uses require once statements in the source files

ZF2 Namespace Prefix Autoloading

15

<?phprequ i re once Z e n d / Loader / StandardAutoloader . p h p ;$ loader = new Zend\Loader\StandardAutoloader ( ) ;$loader−>registerNamespace ( M y , D IR .

/ . . / l i b r a r y / M y )−>r e g i s t e r P r e f i x ( P h l y , D IR .

/ . . / l i b r a r y / P h l y ) ;$loader−>r e g i s t e r ( ) ;

ZF2 Class-Map Autoloading

16

<?PHP$map = ar ray (

M y \Foo\ B a r => DIR . / Foo / Bar . p h p ,) ;

requ i re once Z e n d / Loader / ClassMapAutoloader . p h p ;$ loader = new Zend\Loader\ClassMapAutoloader ( ) ;$loader−>reg is terAuto loadMap ( DIR .

/ . . / l i b r a r y / . classmap . p h p ) ;$loader−>r e g i s t e r ( ) ;

More about ZF2 Class-Map Autoloading

17

• 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 WeierO‘Phiney) Class-Maps show a 25% speed improvement over ZF1Autoloader and a 60% to 85% improvement with a opcode cacheenabled.

Factory

18

Zend\Loader also has a factory that will allow you to quickly assembleyour autoloading strategy and implement it.

<?phprequ i re once Z e n d / Loader / Auto loaderFactory . p h p ;use Zend\Loader\Auto loaderFactory ;Auto loaderFactory : : f a c t o r y ( ar ray (

Z e n d \Loader\ C l a s s M a p A u t o l o a d e r => ar ray (D IR . / . . / l i b r a r y / . classmap . p h p ,D IR . / . . / 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 => ar ray (n a m e s p a c e s => ar ray (Z e n d => DIR . / . . / l i b r a r y / Z e n d ,

) ,f a l l b a c k a u t o l o a d e r => t rue ,

) ,) ) ;

So what are we doing with HowStuffWorks.com

19

• Well as of right now we still do require/include once statements,mostly for performance reasons.

So what are we doing with HowStuffWorks.com

19

• 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 Fallbackusing APC and saw 20% performance increase (approx 40ms on thefront-end.)

So what are we doing with HowStuffWorks.com

19

• 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 Fallbackusing APC and saw 20% performance increase (approx 40ms on thefront-end.)

• Not in production yet but it is on our roadmap (we have a large codebase and it’ll take some time to adapt it all and test it).

Oh Just a Side Note

20

• Matthew Weier O‘Phinney has already taken the liberty to packagethe ZF2 autoloader as a PHP 5.2 compliant package, you can get ithttp://bit.ly/zf2autoloadfor52

Oh Just a Side Note

20

• Matthew Weier O‘Phinney has already taken the liberty to packagethe ZF2 autoloader as a PHP 5.2 compliant package, you can get ithttp://bit.ly/zf2autoloadfor52

• I’ve ported this into the ZendX namespace in a PHP 5.3 compliantpackage, find me later and I’ll get you a copy

Zend\Di

What is DI?

22

• Dependency Injection is just a Construction / Design Pattern,previously discussed (last month actually).

• Pattern outlines that all Dependencies should be passed into anobject 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.

What is Zend \Di for?

23

• ZF2 is planning on using Dependency Injection with it’s Controllersand for provided Services.

• Most of the library components do use Dependency Injection as theirdesign pattern.

• Zend\Di is a construction helper, everything in ZF2 thus far can runwithout the DI Container (maybe not the locater).

Some Details about Zend \Di

24

• Uses dependency maps to do injections.

• These maps can be in php, ini, or xml format (Zend\Config)

• Supports Setter Injection & Lazy Initialization instead of justConstructor Injection.

• May support Dynamic Resolution of Dependencies in the future(Reflection)

• The container, last I tested, was a bit heavy but I know improvementswere being made.

DI Configuration & Locater Example

25

<?phpuse Zend\Di\ D e f i n i t i o n ,

Zend\Di\Reference ,Zend\Di\DependencyInjector as DI ;

$db = new D e f i n i t i o n ( ’My\Db\Adapter\ S q l i t e ’ ) ;$db−>setParam ( ’name ’ , D IR .

’ / . . / data / db / users . db ’ ) ;$mapper = new D e f i n i t i o n ( ’My\Mapper\Db ’ ) ;$mapper−>addMethodCall ( ’ setAdapter ’ , a r ray (new

Reference ( ’ db ’ ) ) ) ;$serv ice = new D e f i n i t i o n ( ’My\Resource\Users ’ ) ;$serv ice−>setParam ( ’ mapper ’ , new Reference ( ’ mapper ’ ) ) ;

$d i = new DI ;$di−>s e t D e f i n i t i o n s ( ar ray ( ’ db ’=> $db , ’ mapper ’ =>

$mapper , ’ users ’=> $serv ice ) ) ;$users = $di−>get ( ’ users ’ ) ; / / My\Resource\Users

Setting Injection Example

26

<?phpuse Zend\Di\ D e f i n i t i o n ,

Zend\Di\Reference ;

$serv ice = new D e f i n i t i o n ( ’mwop\Serv ice \Resources ’ ) ;$serv ice−>addMethod ( ’ setResource ’ , a r ray (

new Reference ( ’ resource ’ )) ) ;

$di−>s e t D e f i n i t i o n ( ’ resources ’ , $serv ice ) ;

$resources = $di−>get ( ’ resources ’ ) ;

Considerations for ZF1 usage

27

• ZF1 does not play well with Dependency Injection with it’scomponents.

• The majority of configuration options require arrays and there issome differing structure for these arrays.

• Controllers require an inherited constructor (which is why most of theinitialization is done in init() )

• Still works good for Service Containers and Data Models

Zend\EventManager

What is the EventManager?

29

• A solution for providing Aspect Oriented Programing principles inPHP, (crosscutting concerns).

• A combination of subject/observer pattern, PubSubHub, and SignalSlots? (wtf is all this?)

• A better way of notifying other parts of the system that an event isabout to occur/has occured with filters so that we can interact on theevent.

But why does that matter?

30

• Allows for handling events without modifying/overwriting frameworkcode.

• Allows you to create hook points for other parts of the system tointeract with at runtime.

• It’s a major evolutionary step to Programing Philosophy (ask memore on Aspect Oriented Programing later if you’re interested)

EventCollection Interface

31

<?phpnamespace Zend\EventManager ;use Zend\ S t d l i b \Cal lbackHandler ;

i n t e r f a c e Even tCo l lec t i on{

p u b l i c f u n c t i o n t r i g g e r ( $event , $context , $argv =ar ray ( ) ) ;

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 , $context ,$argv , $ca l lback ) ;

p u b l i c f u n c t i o n a t tach ( $event , $ca l lback ,$ p r i o r i t y = 1) ;

p u b l i c f u n c t i o n detach ( Cal lbackHandler $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 getHandlers ( $event ) ;p u b l i c f u n c t i o n c learHandlers ( $event ) ;

}

Triggering Events

32

<?phpuse Zend\EventManager\EventManager ;

$events = new EventManager ( ) ;$events−>t r i g g e r ( $eventName , $object , $params ) ;/ * Where :

* − $eventName i s the name of the event ; usua l l y thecu r ren t

* method name

* − $ob jec t i s the ob jec t t r i g g e r i n g the event

* − $params are the parameters the handler mightneed to access ,

* usua l l y the method arguments

* /

Zend Components as of ZF2

Just a quick List

34

• Acl

• Amf

• Application

• Authentication

• Barcode

• Cache

• Captcha

• Code

• CodeGenerator

• Config

• Console

• Controller

• Crypt

• Currency

• Date

• Db

• Debug

• Di

• Dojo

• Dom

• EventManager

• Feed

• File

• Filter

• Form

• GData

• Http

• InfoCard

• Json

• ProgressBar

Just a quick list, cont.

35

• Layout

• Ldap

• Loader

• Locale

• Log

• Mail

• Markup

• Meassure

• Memory

• Mime

• Mvc

• Navigation

• OAuth

• OpenId

• Paginator

• Pdf

• Queue

• Reflection

• Registry

• Rest

• Search

• Service

• Session

• Soap

• Stdlib

• Tag

• Test

• Text

• TimeSync

• Tool

• Translator

• Uri

• Validator

• Version

• View

• Wildfire

• XmlRpc

There are a bunch of components outthere, choose what you want

How To Convert for PHP 5.2

Let’s be realistic

38

Not all components are convertible, if they require the followingcomponents, PHP 5.2 will not run these:

• Closures (Anonymous Functions)

• Late Static Binding

• Garbage Collection

Figuring out Dependencies

39

With 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.

Converting Namespaces

40

Some sticking points:

• It’s easy to replace the namespace separator with the ZF1 but besure to find and replace aliases.

• It may be worth renaming the namespace from Zend to ZendX ifusing 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.

Conclusions

41

• ZF2 Components are awesome, we can use them in ZF1 Projects(with a little work).

• ZF2 Components have benefits, performance being one, shininessbeing two.

• Integration ZF2 Components now will make refactoring to use ZF2later easier.

• Why Not? The idea behind Zend Framework is to make reusablecomponents (it’s technically a library not a framework), don’t getstuck on legacy library components just because you can’t upgradeyour whole stack.

Questions?

Thank You

43

Thank 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.