2. WHO IS RYAN MAUGER?
• Zend Framework Contributor
• Zend Framework CR Team Member
• Co-Author of Zend Framework 2 in Action (With Rob Allen)
• Technical Editor for Zend Framework: A Beginners Guide
• Community Supporter
• Zend Certified PHP5 Engineer
• Lead Developer at Lupimedia
3. WHAT ARE YOU GOING TO
TAKE AWAY
Fundamental concepts to help you figure things out
for yourself
4. WHERE TO START?
• Tutorials
• Akrabat’s (Rob Allen): http://akrabat.com/zft
• Official Quickstart: http://bit.ly/zf-quickstart
• Build your own sandbox
• KEEP IT!
• Add to it, keep additions for later reference
7. BUT WHAT SHOULD I
TACKLE FIRST?
• Understand the Lifecycle of a ZF request
8. BUT WHAT SHOULD I
TACKLE FIRST?
• Understand the Lifecycle of a ZF request
• Understand the Lifecycle of a ZF request
9. BUT WHAT SHOULD I
TACKLE FIRST?
• Understand the Lifecycle of a ZF request
• Understand the Lifecycle of a ZF request
• Understand the Lifecycle of a ZF request
10. BUT WHAT SHOULD I
TACKLE FIRST?
• Understand the Lifecycle of a ZF request
• Understand the Lifecycle of a ZF request
• Understand the Lifecycle of a ZF request
• Understand the Lifecycle of a ZF request
17. BOOTSTRAPPING
• Initialise everything you may need
• Make things ready for your request to be
dispatched
• Do nothing module specific
• Remember your module bootstraps, even if they
are empty!
20. FRONT CONTROLLER
PLUGINS
• Provide hooks into various points in the request lifecycle
• Run Automatically
• Should be able to run independently of the action controller
itself
• Exceptionsthrown in preDispatch will not prevent further
plugins preDispatch calls being run
• Are easier to use if you have no constructor parameters.
21. ADDING A FRONT
CONTROLLER PLUGIN
• In the config
autoloaderNamespaces[] = " My_ "
resources.frontController.plugins[] = "My_Controller_Plugin";
• In the bootstrap (useful for modules)
<?php
class ModuleName_Bootstrap extends Zend_Application_Module_Bootstrap
{
protected function _initPlugins()
{
$this->getApplication()
->getResourcePlugin('frontController')
->registerPlugin(new ModuleName_Plugin_Acl());
}
}
22. ACTION HELPERS
• Provide hooks into the request lifecycle
• Run automatically, or on demand
• Are intended to either replace repeated code in your actions
(think DRY) or to extend functionality of action controllers
• Thrown Exceptions in pre/postDispatch will stop further
execution of other action helpers
23. ADDING AN ACTION HELPER
• In the config
resources.frontController.actionHelperPaths.My_Action_Helper = "My/Action/Helper"
• In the bootstrap (useful for modules)
<?php
class Abcd_Bootstrap extends Zend_Application_Module_Bootstrap
{
protected function _initActionHelpers()
{
Zend_Controller_Action_HelperBroker::addPath(
'My/Action/Helper',
'My_Action_Helper'
);
Zend_Controller_Action_HelperBroker::addHelper(
new My_Action_Helper_Thingy()
);
}
}
24. ACTION HELPER OR FC
PLUGIN?
START
Front Controller Plugin Action Helper
Do you need to
Error Handler interact with it from
the controller? Yes Redirector
Layout Flash Messenger
No
Action stack Context Switch
Do you need to
Yes
hook earlier than
preDispatch? No
View Renderer
29. AUTOLOADING
• Library components
• Follows PEAR naming
• Used where ever you see:
• new Zend_Form()
• new Zend_Db()
• new Zend_Service_...
30. PLUGIN LOADING
• Prefixes names to resolve a classname, and path
to load
• Can work away from the include_path
• Is
used wherever a class is created with only a
suffix
• FormElements, View Helpers, Action Helpers,
Resource plugins
31. RESOURCE LOADING
• Resolves classnames which do not map 1:1 with the
filesystem
Application_Model_Page : application/models/Page.php
• Is used for module components (forms, models, services)
• Provide a namespace for the module
• Iscreated automatically for modules with a module
bootstrap
• Makes your modules directories ‘tidier’ (controllers, views,
models, forms, etc)
32. LOADERS IN ACTION
Plugin Loading
<?php
class My_Form extends Zend_Form
{
public function init()
{
$this->addElement('Text', 'aTextBox', array('label' => 'A text Box'));
}
}
“Text” is resolved to Zend_Form_Element_Text by looping
through the given prefix paths until a match is found
33. LOADERS IN ACTION
Adding your own prefix path
<?php
class My_Form extends Zend_Form
{
public function init()
{
$this->addElementPrefixPath('My_Form_Element_', 'My/Form/Elements/');
$this->addElement('Text', 'aTextBox', array('label' => 'A text Box'));
}
}
Zend_Form::addElementPrefixPath() is an example of accessing a
resource loader to add an extra prefix path.
There is also an optional third parameter, to specifically supply a path
for only elements, decorators, filters, or validators
34. LOADERS IN ACTION
Autoloading
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
autoloaderNamespaces[] = "My_"
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
<?php
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$myComponent = new My_Cool_Component();
}
}
35. LOADERS IN ACTION
Resource Loading
<?php
class Admin_IndexController extends
Zend_Controller_Action
{
public function indexAction()
{
$form = new Admin_Form_EditPage();
$this->view->form = $form;
}
}
37. WHAT CAN I PUT IN
$OPTIONS?
• $options is always an associative array
• Each key is normalised and turned into a method name for a setter.
‘foo’ becomes ‘setFoo’, ‘bar’ becomes ‘setBar’
• If that setter exists, it is called, and the value at that index is passed as
a single argument
• Generally, exceptions are not thrown for invalid options.
• Some components will store any options without a setter for other
purposes, e.g. Zend_Form, options without a setter become attributes
38. WHERE CAN I SEE THE
AVAILABLE SETTERS?
• The API documentation (http://framework.zend.com/apidoc/
core)
• Your IDE (autocomplete)
• The manual
39. ADVANTAGES OF USING
OPTIONS ARRAYS
• Flexibility of configuration
• Easily extended
• Largely self documenting
40. TAKING ADVANTAGE OF THE
OPTIONS ARRAY IN ZEND_FORM
<?php
setPage() is called
class Admin_Form_EditPage extends Zend_Form
{
protected $_page;
before init(), allowing
public function init()
you to pass through the
{
$this->addElements(array( constructor an object,
//...
$multi = new Zend_Form_Element_Select('multi'),
//...
array, or scalar value to
)); be used for any
}
$multi->setMultiOptions($this->_page->getOptions());
purpose when
public function setPage(Application_Model_Page $page) initialising your form.
{
$this->_page = $page;
return $this;
}
}
42. HOW THE HECK DO
DECORATORS WORK THEN?
Label <dt><label></label></dt> Rendered
inside-out,
HtmlTag <dd>...</dd> each
wrapping,
appending or
Element <input.../>
prepending
Description <p>...</p> content to the
content from
Errors <ul>...</ul> the previous
decorator
43. DEFINING A DECORATOR
STACK
$multi->setMultiOptions($this->_page->getOptions())
->setDecorators(array(
'ViewHelper',
'Description',
'Errors',
array('HtmlTag', array('tag' => 'dd')),
array('Label', array('tag' => 'dt')),
));
ViewHelper - Renders the element
Description - renders a paragraph beneath
the element (if a description is set)
Errors - Adds a ul beneath the element
HtmlTag - Renders the dd element
Label - Renders the label and dt tags
52. WHICH PATTERN TO USE?
• Maintenance cycle
• Complexity of the application
• Project timeframe
• Available
solutions (Doctrine, Propel,
phpDataMapper), do they suit you?
54. WHAT DOES ZF SUPPORT?
DB Abstraction
Expect some sort of integration with Doctrine2 when ZF2
arrives
Doctrine2 is gaining popularity as the ORM of choice for ZF
on the whole
Doctrine 1.x is already a very common choice of ORM,
though based on Active Record