Federico Cargnelutti

Simple is better than complex. Complex is better than complicated. | @fedecarg

Zend Framework Architecture

with 15 comments

Introduction

Before we begin our exploration of the architecture of the Zend Framework (ZF), it is important to discuss how a typical MVC application is built. Examining and understanding the architecture of an MVC Web application allows you to make more contextually sound choices when building your application.

Three-tier Architecture

The three-tier architecture focuses on defining responsibilities between different parts of the application. It has the following tiers:

Presentation Tier
The top-most level of the application is the UI. The main function of the interface is to translate tasks and results to something the user can understand.

Application Tier
This layer coordinates the application, processes commands, makes logical decisions and evaluations, and performs calculations. It also moves processes data between the two surrounding layers.

Data Tier
Here information is stored and retrieved from a database or file system. The information is then passed back to the logic tier for processing, and then eventually back to the user.

Model-View-Controller Architecture

Although the three-tiers is similar to the MVC architecture, they are different. Conceptually the three-tier architecture is linear. The Presentation tier never communicates directly with the data tier and all communication must pass through the Application tier. However, the MVC architecture is triangular: the View sends updates to the Controller, the Controller updates the Model, and the View gets updated directly from the Model.

Zend Framework

Zend Framework provides components for the MVC and Table Gateway design patterns which are used in most Web applications. Developed by Zend Technologies and released in 2005, Zend Framework is heavily based on the Solar Framework, developed by Paul M. Jones, reason why they share a similar underlying architecture.

There are 3 types of Web application frameworks:

  1. The ones that offer a solid infrastructure: Symfony, Solar, Ruby on Rails and Django.
  2. The ones that offer a component library: ezComponents and PEAR.
  3. The ones that offer both: Zend Framework.

Zend Framework not only offers a solid infrastructure, but also an extensive component library. The component structure of ZF is somewhat unique, each component is designed with few dependencies on other components. This loosely-coupled architecture allows developers to use components individually.

Architecture

The framework architecture is based on the Front Controller and Model-View-Controller architectural patterns:

MVC pattern

The Model is the part of the application that defines its basic functionality behind a set of abstractions. The data access layer and some business logic is defined in the Model. The Views define exactly what is presented to the user. Usually controllers pass data to each view to render in some format. The Controllers bind the whole pattern together. They may manipulate models, decide which view to display based on the user’s request and other factors, pass along the data that each view will need, or hand off control to another controller entirely.

Front Controller pattern

Zend_Controller is the heart of Zend Framework’s MVC system. Zend_Controller_Front implements a Front Controller pattern, in which all requests are intercepted by the front controller and dispatched to individual Action Controllers based on the URL requested.

Coupling

ZF provides a loosely-coupled component library simplified to provide most of the functionality everyone needs to develop Web applications. In object-oriented programming coupling or dependency is the degree to which each component relies on each one of the other components. The biggest advantage of a loosely-coupled architecture is that it allows developers to use components individually.

Neil Garb did an excellent job measuring the level of coupling in the Zend Framework based on the number of dependencies set in code. I’ve extended his work by measuring the level of coupling between components set at runtime. I’m using the Inclued extension to trace through the hierarchy of file inclusions and class inheritance at runtime.

The following diagrams where generated using Graphviz:

Zend_Controller dependencies

Zend_Controller and Zend_Db dependencies

Zend_Controller, Zend_Db and Zend_From dependencies

A standard Zend Framework application requires the following components: Zend_Controller, Zend_Uri, Zend_Registry, Zend_Loader, Zend_Config, Zend_Layout, Zend_View, Zend_Filter, Zend_Validate, Zend_Db, Zend_Form and Zend_Exception.

Criticism

Zend Framework is intended to serve as a novel way to manage Web development complexity. Many consider ZF to deliver reasonably well on this promise, however, it does not universally accommodate all design styles, environments or requirements.

Performance

The performance of a framework is influenced by many factors, particularly the configuration of your servers. However, the design of an application can make a big difference and determine whether your site is slow or highly responsive. Recent benchmarks show that the Zend Framework is slower than other Web frameworks.

Although low coupling is a sign of a well-structured system, it may reduce performance, and a highly-coupled system is sometimes desirable to achieve maximum efficiency. Regardless, in many modern frameworks, the cost of reduced performance is often seen as a worthy trade for the benefits to the software development process that result from low coupling.

Design

Although the framework supports modularity, it lacks of some basic features, such as a Module Coordinator. The system doesn’t include any component or configuration mechanism to deal with Model and Controller dependencies, making it very difficult to share modules between applications. Also, Zend_Controller doesn’t allow modular systems to load model files from within its own module as well as outside modules.

The system lacks of local containers to manage object dependencies and interrelationships. Instead, it uses a global container to store objects. According to Troels Knak-Nielsen, the problem with this is that a global container, whether primitive or sophisticated, will always be a global symbol. Most programmers will agree that global variables are bad design, and that goes for a global containers as well.

Namespaces

With PHP 5.3 coming up on the horizon, the Zend Framework API faces a re-design. While namespaces will hopefully lead to more readable code, Zend developers will finally need to start thinking about some standards for abstract classes and interfaces.

Links

Advertisement

Written by Federico

July 28, 2008 at 12:23 am

15 Responses

Subscribe to comments with RSS.

  1. [...] Zend Framework Architecture — A promising article in one of the better PHP blogs. Doesn’t take into account the work that Matthew Weier-O’Phinney has already done to start refactoring ZF for 5.3. [...]

    Karl Katzke

    July 28, 2008 at 12:18 pm

  2. [...] информацией об архитектуре фреймворка Zend Framework можно тут. Информация на английском языке. Кроме описания [...]

  3. Excellent post Federico. How does the inclued library work? Or where can I find more info about it?

    Thanks,
    Tomi

    Tomi

    July 28, 2008 at 4:36 pm

  4. Great article, very informative. Thanks!

    Chris Abernethy

    July 28, 2008 at 4:38 pm

  5. [...] the article @: Zend Framework Architecture « PHP::Impact Bookmark and [...]

  6. You mention that the global container Zend_Registry goes against design philosophy… Are you also recommending we use Zend_Registry as little as possible, in anticipation of the PHP 5.3 improvements?

    gavin

    July 29, 2008 at 6:09 pm

  7. Using Zend_Registry has its consequences, for example, you need to understand the whole system to be able to modify or replace a single component and also, you have to predict the long term requirements of the system. Cake and CodeIgniter are great examples of highly-coupled frameworks. Zend Framework, on the other hand, is loosely-coupled.

    If you want to reduce coupling between components, I’d recommend using a local container. That’s why I think Zend_Container is the one to watch. The purpose of this component is to replace the use of singletons and Zend_Registry. More info here.

    Federico

    July 29, 2008 at 9:02 pm

  8. Great post, Federico!

    RE: A standard Zend Framework application requires the following components: Zend_Controller, Zend_Uri, Zend_Registry, Zend_Loader, Zend_Config, Zend_Layout, Zend_View, Zend_Filter, Zend_Validate, Zend_Db, Zend_Form, Zend_Paginator and Zend_Exception.

    I find it hard to believe that a standard ZF app requires Zend_Paginator, since it won’t be released until 1.6. ;)

    The Zend_Container proposal is very interesting, as was yours. We’ll be watching this proposal closely to see if the community can come to a consensus on the value and required complexity of such a DI container.

    BTW, it’s all but decided that Zend’s contributions to 1.7 will be primarily- if not exclusively- performance fixes. Well, performance fixes and more development of Zend_Tool. :) I know that performance testing and optimization is a big investment and is very important to ZF’ers, so I think it will give the Zend-employed ZF’ers a good chance to evaluate key components very closely with no functionality/optimization effort tradeoffs before them.

    Of course, namespace support is a likely feature in ZF 2.0, but I can tell you it will be at least a few months before we start the 2.0 discussions in earnest.

    ,Wil

    Wil Sinclair

    July 31, 2008 at 8:18 am

  9. [...] Zend Framework Architecture A nice overview of how the Zend Framework is organized. Shows some very hefty component dependency diagrams. [...]

    GrantPalin

    August 4, 2008 at 2:07 am

  10. ZF performance has pretty much gone done every performance release.. Its gone from being one of the fastest out there where I was really interested in it to one of the slowest. One of the things that killed my interest every time I brought performance up it got blown off.

    It was always features first performance later, but its a chicken and the egg issue and you can’t deal fully with one without thinking of the other.

    http://www.phpjack.com/content/zend-framework-performance

    Richard Thomas

    August 14, 2008 at 8:10 am

  11. [...] Zend Framework Architecture [...]

  12. [...] Zend Framework Architecture [...]

    Top Posts 2008

    January 10, 2009 at 3:07 pm

  13. [...] Zend Framework Architecture Possibly related posts: (automatically generated)Panasonic Looking for Zend Framework Developers Posted by Federico Filed in Design Patterns, Frameworks, Open-source, PHP, Software Architecture No Comments » [...]

  14. [...] Zend Framework Architecture « fede.carg ( blog ) [...]

  15. Very good summary of Zend Framework.

    If i could add something i would say that Zend Framework is probably still the nicest components library for php (considering its size).

    On the other hand it lacks interfaces, uses way too many static calls and has bloated APIs. Some of the components would benefit from breaking them down into smaller units with simple responsibility.

    All very good points especially on lack of dependency management.

    Ejsmont

    July 30, 2011 at 4:59 pm


Leave a Reply

Fill in your details below or click an icon to log in:

Gravatar
WordPress.com Logo

Please log in to WordPress.com to post a comment to your blog.

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 43 other followers