[Catalyst] Re: From the beginning...

Andy Grundman andy at hybridized.org
Wed Apr 13 03:00:54 CEST 2005


LD wrote:
> script/create.pl (which needs a man page!) will allow you to create 
> views, models and controllers separately - great. But the idea of 
> re-usable components is that they are self-contained. So it would be 
> great if script/create.pl allowed the following...
 > ...
 > lib/MyApp/MyComponent.pm
 > lib/MyApp/MyComponent/M/MyComponent.pm
 > lib/MyApp/MyComponent/V/MyComponent.pm
 > lib/MyApp/MyComponent/V/MyComponent.tt
 > lib/MyApp/MyComponent/C/MyComponent.pm

Your entire app might probably only need 1 model and 1 view class, each 
with only a few lines of code.  The model reads your database structure 
and dynamically creates all your database classes/relationships, and the 
view just simply defines how TT will be used.  These things wouldn't 
need to be duplicated in lots of different "components".

The type of class that you will have many of are your controllers.  You 
could fit every action into a single controller, but I prefer to split 
things out in a logical fasion based on what URL it supports.  Cat5 
encourages this by automagically supporting these types of URLs when you 
use a "Local" action.  I'm currently building a little app that manages 
a list of servers and the applications installed on them.  I have a 
structure like this:

MyApp::C::Server (/server/* methods)
MyApp::C::Server::Apps (/server/apps/*)
and so on.

So for example, Catalyst maps the URL /server/apps/view to:
sub view : Local { } within MyApp::C::Server::Apps.  Cat5 has a nice 
ASCII table listing when running in debug mode that displays all of 
these mappings.

Catalyst's directory tree is organized properly IMO.  It is best to 
leave all templates in their own directory (/root) and the controllers 
under /lib.  This lets non-developers work on HTML/TT without having to 
wade through Perl code in nearby files.  Of course, I've never worked 
anywhere that has separate HTML people working this way, but it sounds 
good in theory. :)

> ./script/create/.pl component MyComponent [ parentComponent ]
> ./script/create/.pl component MyComponent [CDBI ...] [TT] [C 
> parentController]

The concept of inheritable controllers is a good one, and while it is 
not mentioned, you can already do this.  In fact, my app takes advantage 
of this to allow the Apps class to access a utility method in the 
Servers class:

MyApp/C/Server.pm:
sub _setServerData {
   # set some stash variables common to all servers
}

MyApp/C/Servers/Apps.pm:
use base 'MyApp::C::Server';
...
$self->_setServerData(...);

The create.pl helper could certainly add that to the list of things it 
can build for you.

I have worked with a legacy WO app before, but only in a "hope it keeps 
running" mode and have never done development with it.  I was 
immediately turned off by WO when I saw the horrid obfuscated URL scheme 
they use.  That, and the fact that I can't stand Java. ;)

--
Andy Grundman



More information about the Catalyst mailing list