Zend Framework 1.5 is on its way!
As many know, Zend Framework 1.5.0 is almost ready for release… heck, it might even be released by the time you read this. There are a ton of new features worth looking into, but I'll list some of my own favorites here - the ones I've been either working on or using.
Zend_Layout and Zend_View enhancements
I've been using the Two Step View pattern for years now, and its practically
second nature with each project to set it up. With Zend_Layout
now released, I
no longer have to setup a plugin of my own and think about how it all works — I
can just create my site layout and start working.
But Zend_Layout
by itself isn't that revolutionary. What is revolutionary is
the combination of Zend_Layout
with a variety of new view helpers: partials,
placeholders, and actions. In particular, placeholders are increasingly finding
a place in my toolbox.
As an example, I use the new headScript()
and headLink()
view helpers in my
applications a ton. They allow me to specify javascript and CSS includes for my
HTML head section… and also prevent me from accidently including the same file
multiple times. Add to this the fact that, as placeholders, they can also
capture arbitrary content for later inclusion, I can now create javascript that
I need for a particular view in that view and include it in the document head
easily. This helps me keep my UI logic close to the application, while still
keeping it located in the appropriate place in the document.
Zend_Form
To be honest, about half-way through writing Zend_Form
, I was seriously
wondering if a form component was necessary; having Zend_Filter_Input
directly
in your model, and simply writing your forms using Zend_View
helpers seemed
perfectly straightforward and painless.
However, I've had a chance to play with Zend_Form
a fair bit since then, and
I'm very much appreciating the component. With it, I can put all the information
about an element — how it should validate, any pre-filtering I want, any
metadata I want to associate with it, and also hints as to how I want it
rendered — all in one place. While it seems like a dangerous mix of business
logic and presentation logic, it's not. The display logic is self-contained in
the decorators used to render the element — and are not even necessary. But
having them present also means that my views can be much simpler than they
were in the past, as can my controller and/or model logic — I can pull all the
information in from the form, and simply use it.
As an example, consider this controller action:
<?php
class FooController extends Zend_Controller_Action
{
public function formAction()
{
$request = $this->getRequest();
$form = $this->getForm(); // helper method to pull in form
if (!$request->isPost()) {
// display form
$this->view->form = $form;
return;
}
if (!$form->isValid($request->getPost())) {
// form not valid; re-display
$this->view->form = $form;
return;
}
// Valid form; save data
$this->getModel()->save($form->getValues());
$this->_helper->redirector('success');
}
}
?>
And the related view script for displaying the form:
<h2>Please fill out the form</h2>
<?= $this->form ?>
Seriously — while there may be a fair amount of code to setup the form, it's self-contained, and leads to some seriously shorter methods and views — making the rest of the application logic much cleaner and easier to read. I like clean and easily read code.
Zend_Search_Lucene
Sure, this component has been around for a long time, but Alex has done some increcible stuff with it. You can now build queries programmatically, and have support for wildcard searches. Additionally, you now have the ability to modify the index in place, without re-building — which means that as your site grows, you don't have to worry that indexing the site is going to consume more and more resources.
Zend_Db_Table Improvements
One thing that has always been a thorn in my side is that I will often want to
do a query that includes a JOIN from within a Zend_Db_Table
… but it hasn't
allowed this. This has led to having custom methods that return arrays, or
adding logic that returns custom ResultSets
… all of which is tedious. Simon
has put in a ton of time in the past few months to make these headaches go away.
You can now return read-only resultsets that contain joins, letting you access
your JOIN'ed rowsets just as you would one containing only the current table's
data.
Additionally, instead of needing to build your SQL by hand, or build it with
Zend_Db_Select
and then cast it to a string, Simon has also added the ability
to create Zend_Db_Select
's directly in your table classes, and pass them to
any method that performs a query. This improvement will also save me time —
particularly when coupled with the ability to return JOINed ResultSet
s.
Context Switching and REST
Something I've been playing with for some time now is the ability to change view
context by simply changing a parameter in the request. For example, you may want
to return XML or JSON in addition to HTML from a given action. One thing I've
added for 1.5.0 is a ContextSwitch
action helper that helps automate exactly
this.
With your actions ContextSwitch
enabled, you can then request an action and add
a format
parameter with the desired context: /foo/bar/format/xml
. The
parameter is detected, checked against a list of allowed contexts, and then, if
available, a separate view is rendered and the response headers changed to match
the format.
In the above example, /foo/bar/format/xml
, this would mean that a response
Content-Type
header of text/xml
would be returned, and instead of rendering
the foo/bar.phtml
view script, the foo/bar.xml.phtml
script would be
rendered. This allows you to have separate display logic for different contexts.
In addition to context switching, at the request of some vocal contributors,
I've added a variety of methods to Zend_Controller_Request
to allow detecting
the various HTTP request types (HEAD, GET, POST, PUT, DELETE, etc.), as well as
retrieving raw post data. These, combined with context switching, will allow
you to build REST services into your existing MVC apps trivially.
Conclusion
There are a ton more features coming out with 1.5.0. Visit the framework site in the coming days to see what all is new, and download the new release to give it a try!