This week, I've been attending Symfony Live in Paris, speaking on integrating Zend Framework with Symfony. The experience has been quite rewarding, and certainly eye-opening for many.
To be honest, I was a little worried about the conference — many see Symfony and ZF as being in competition, and that there would be no cross-pollination. I'm hoping that between Fabien, Stefan, and myself, we helped dispel that myth this week.
The fact of the matter is that no single project can be fully comprehensive, and do everything perfectly. In my examinations of different frameworks, PHP and otherwise, the places where they most differ and which generates the most loyalty amongst users are the MVC approaches and tooling support. In good frameworks, this is just a portion of the code, and the remainder is in support libraries or plugins that extend that functionality.
This is true of both Symfony and Zend Framework. Symfony's development team has
chosen to focus on a very specific core of functionality related to the MVC
approach, which makes their maintenance job easier, and leads to a stable
product. Zend Framework's MVC implementation is offered as a group of separate
components, with components such as
to bring cohesion and structure to them.
What this means is that once you've developed the basic infrastructure of your application, the scaffolding, you're now left with decisions about how to implement the actual functionality of the application itself. The problem as I see it is: how do you do that development? Many developers are myopic and will not look beyond the framework they have chosen for for development. This can lead to multiple implementations of the same code, and often leads to incomplete implementations as well.
My feeling is that whenever you find yourself about to write new code, look to see if somebody else has written the code already. Anybody — don't limit yourself to your framework of choice. If I want to do serious HTML sniffing, validation, and cleanup, I go to HTMLPurifier; if I want a workflow component, I check out eZ Components Workflow; I always check PEAR.
This week, I tried to spread this message within the Symfony community, showing them how easy it is to integrate ZF components within Symfony projects. The integration itself is simple: instantiate the Zend autoloader, and start using ZF classes. This same technique can be used to load PEAR, or eZComponents, or Doctrine 2, etc. The trick is getting out of the "Not Invented Here" syndrome, letting go of your ego, and using other people's code.
(Yes, I know we have code in ZF duplicating functionality in other libraries; in most cases, we try and offer at least a new approach to the problem — but we could do better.)
Fabien also made an interesting announcement. During a Q&A session with the
Symfony core team, he said that Symfony 2 will not write re-invent the wheel
when it doesn't need to — and announced that Symfony 2 will be using
Zend_Cache instead of rewriting the current Symfony components. I find
this admirable — and it's something I'm hoping to do in a few places with Zend
Framework 2.0 as well, as I know there are features and code that others have,
quite simply, written better.
One last note in this ramble: With the various "2.0" versions of frameworks, most projects are learning from both mistakes made as well as from the usage patters of the developers adopting them. One of those lessons, to my mind, is that no one framework can do it all well and by themselves. I fully expect to see the next generation of frameworks making it trivial to pull features from other frameworks and libraries in order to fill out functionality.