[development] is drupal a MVC stuff

Alex Bronstein alex at craftyspace.com
Fri Dec 11 18:20:21 UTC 2009

The problem with language in general, and domain-specific jargon 
especially, is that there are layered definitions for the same term. 
 From a very broad-stroke perspective only, one can call Drupal an MVC 
framework. From http://en.wikipedia.org/wiki/Model-view-controller:

Model–View–Controller (MVC) is an architectural pattern used in software 
engineering. The pattern isolates business logic from input and 
presentation, permitting independent development, testing and 
maintenance of each.
MVC is often seen in web applications where the view is the HTML or 
XHTML generated by the app. The controller receives GET or POST input 
and decides what to do with it, handing over to domain objects (i.e. the 
model) that contain the business rules and know how to carry out 
specific tasks such as processing a new subscription.
In the design of web applications, MVC is implemented by web template 
systems as a "View for web" component.

MVC is typically implemented as a "Model 2" architecture in Sun 
parlance. Model 2 focuses on efficiently handling and dispatching full 
page form posts and reconstructing the full page via a front controller. 
Complex web applications continue to be more difficult to design than 
traditional applications because of this "full page" effect. More 
recently AJAX driven frameworks that focus on firing focused UI events 
at specific UI Components on the page are emerging. This is causing MVC 
to be revisited for web application development using traditional 
desktop programming techniques.

As Pierre points out, Drupal (and especially Drupal 7) mostly follows 
all of this.

However, only if you lump "all the module code" into the "model", and 
ignore that a lot of modules implement their own sub-frameworks, 
complete with their own sub-controller and sub-view layers. That's why 
Larry correctly points out that Drupal is closer to PAC 
(http://en.wikipedia.org/wiki/Presentation-abstraction-control), but 
even that isn't strictly accurate.

Architecturally, Drupal core is a mish-mash of different patterns, some 
implemented consistently with the well-accepted rules of the pattern, 
some implemented inconsistently for no good reason, and some 
intentionally violating the rules for performance or some other valid 
reason. On top of that, Drupal is first and foremost a module-oriented 
framework, there are thousands of modules, and each one is free to use 
its own patterns, well or poorly depending on the module maintainer.

This makes it hard to explain what Drupal is with any single term like 
MVC. But that's not to say that Drupal isn't an awesome framework. While 
it can still be improved and simplified, and learn from the lessons of 
other frameworks, it's a very practical and powerful framework that 
allows modules to do just about anything, themes to control almost every 
aspect of the presentation, and includes some pretty powerful 
control-layer and utility tools in core.

Pierre Rineau wrote:
> On Fri, 2009-12-11 at 10:40 -0600, larry at garfieldtech.com wrote:
>> The defining attribute of MVC is, IMO, that the View component has 
>> direct access to the Model component using an observer relationship, 
>> without going through a separate Controller.
>> hook_page_alter() is in no way a direct observer relationship between 
>> the View component and the Model component.  *_alter hooks are a 
>> pipes-and-filter approach, or, arguably, visitor pattern.
>> Drupal is very much not an MVC design.  It's not true PAC either, but I 
>> have and do argue that it is closer to PAC than MVC.
>> Someone needs to correct the Wikipedia page, which is simply wrong in 
>> this regard.
>> --Larry Garfield
> If you want to stick to strict MVC definition, yes Drupal is not, but in
> the most software I saw or developed with until now, not anyone had a
> real MVC implementation.
> In MVC, this Controller -> Model -> View (data flow)
> In Drupal, data flow is:
>  - Controller (menu router) -> Model (menu callback, module code)
> (direct association)
>  - Model (indirect association through the theme() calls) -> View
>  - View -> Controller (indirect association, through user clicks)
> This is an incomplete and simple (without the observer/observable
> pattern) implementation, but I think it does sticks to MVC pattern.
> This is an opinion, I think it can be discussed.
> Hook system is a different pattern used for different goals, mostly used
> to alter data (it does not alter the behavior I described upper, except
> maybe in some really weird cases).
> Pierre.
> Event if observer pattern is not really here, I think it sticks to MVC
> pattern.

More information about the development mailing list