All this MVC discussion has been very helpful. There are obviously
many ways to do MVC web apps and I'd love to get a bit of feedback on
the approach we are currently planning for ours before we jump into
coding. Our app is a platform for running econ experiments, each of
which is structured a bit like a multi-player game.
We already have a pretty well developed Model containing the
application logic, and for the web UI we're planning to use Mason for
a number of reasons which I won't get into here. The only reason I
mention it is that our approach does use Mason specific features like
autohandlers/dhandlers.
The directory structure looks something like ...
/C
/autohandler
/login
/register_action
/login_action
/E
/Game1
/autohandler
/submit_decision_action
/display_results_action
/Game2
/autohandler
/submit_decision_action
/display_results_action
/V
/autohandler
/login
/E
/Game1
/autohandler
/decision_submission_view
/results_view
/Game2
/autohandler
/decision_submission_view
/results_view
... where the stuff under /C makes up the Controller(s) and the stuff
under /V the Views. The C components and corresponding autohandlers
are pure Perl (no HTML output) and the V components and autohandlers
are simple templates with minimal code (presentation-related only).
URLs would always point to some action component under /C which would
then call the appropriate view component under /V using the new
sub-request mechanism in Mason 1.1. This would allow us to use
autohandlers as a directory based inheritance mechanism for sharing
Controller code. And we can also use autohandlers as a directory
based inheritance for templates for wrapping page content.
So a Controller would consist of an action component and all of its
autohandlers, and a View would consist of the view component and its
autohandlers.
In order to avoid hard coding paths & URLs, we would use something
like the action table Chris Winters mentioned. This would be a Perl
object with action key to component path mappings, as well as view
name to component path mappings. We'd probably put this action table
as well as some of the font/color type of data together into some
UIConfig class, similar to what Rob Nagler is doing with his Facade.
The appropriate sub-class of UIConfig to use for a given request
would be specified in the autohandlers under /C, with /C/autohandler
providing a default, which could be overridden by
/C/E/Game<n>/autohandler.
One nice feature of this architecture is that it should allow us to
easily create a new Game3 which inherits all actions and views from
Game2. Overriding an action or view could be done by creating a new
UIConfig sub-class which inherits from the one used by Game2 and
overrides the corresponding entry in the action table.
I'm sure there are details that I haven't thought about yet, but any
comments on this structure?
Tear it apart! :-)
--
Ray Zimmerman / e-mail: [EMAIL PROTECTED] / 428-B Phillips Hall
Sr Research / phone: (607) 255-9645 / Cornell University
Associate / FAX: (815) 377-3932 / Ithaca, NY 14853