We’re using Zend Framework as our PHP framework, to help us turn projects around quickly without sacrificing stability. We ended up choosing this over the likes of CakePHP, Symphony, CodeIgniter, etc. for a few reasons.
Firstly, we wanted to be sure to choose a framework that supported configuration over convention, as we don’t like the idea of having to learn and work by somebody else’s rules.
Secondly, the modular, flexible approach was really attractive – the nice thing about ZF is that even if you don’t use it you can still grab and use individual bits of it.
Thirdly, it’s full-featured – it has a very large set of functions and classes, and embraces design patterns throughout, so it’s really stable too (in general).
Now that we’ve been using it for a few months, we’ve used the majority of its features and have a lot more to say about it – both good and bad. We use the MVC configuration (which slightly invalidates the first reason above), and have extended an awful lof of the framework for our own shared library. That’s because it’s coded to be SO flexible that you end up having to set a lot of options every time you use any of the classes; and as soon as you do that a few times you realise you’re better off extending the ZF class to include your defaults.
Once you start making your own extension to the library, you find that you can kick off a new project and be looking at forms related to database fields, all covered by 3-level one way secure logins, all within 30 minutes of getting the repository going. Which is pretty amazing.
On the other hand, the Zend_Form output code is pretty naff (every element is within a DD tag and every label within a related DT tag), and modifying this is painful but ultimately rewarding. The default layout system doesn’t observe what we think as the crucial split between design and code. The image upload code (for forms) is pretty comprehensive in its aims, but not yet finished (and the manual is not in sync with the project’s progress).
Despite all this, the main downside to ZF is the documentation. It’s often poorly written, doesn’t go into enough detail and doesn’t give context for its examples – what use is
when you don’t know what scope $this is? It isn’t always in sync with the most recent version, and the site it’s presented on is painfully slow! This all adds up to a steep learning curve being lightly greased, so that it takes longer than it should to find out how to use what are actually great components (often looking into the source is the only way to find out what’s going on).
Having said that, overall we’re massively happy with it, but we’ve found it takes a while to get a new bit of functionality working at all, then a bit longer before it works the way you want it to, but once you have it right it works very well and incredibly powerfully. We would (and do) recommend it to anyone willing to invest some time into making something that’ll pay dividends in the long run.