[Catalyst] some basic Catalyst theory questions

Sebastian Riedel sri at oook.de
Mon Jun 6 23:11:11 CEST 2005

Am 06.06.2005 um 22:16 schrieb Perrin Harkins:
> I'm working on my presentation about MVC frameworks for YAPC, and I  
> have
> some questions about the theory behind some of the design decisions in
> Catalyst.


> - What's the reasoning behind the use for $c->forward() everywhere in
> place of normal method calls?  The only clear advantage I can see is
> that the context object is passed along automatically.  Is there  
> another
> reason?

Next to the context you get an eval cage around your method call with  
profiling. (in the log with enabled -Debug)
And you get some generic points for AOP hooks, but thats just theory  
actually... :)

> - The examples show machine-specific configuration like database
> connection params and file paths being specified in the code itself.
> That would be a big portability problem, if you have to modify the  
> code
> on every new machine.  Is there a plan for Catalyst to help people  
> with
> putting this kind of stuff in a config file?  (Note that I am not
> talking about things like database table relationships, just the pure
> config stuff that is likely different on every installation of the  
> same
> app.)

We already have a $c->config->{home} variable, which always points to  
the applications home (we hacked Module::Build to let you install cat  
apps like ordinary cpan modules!)

I tend to use this little idiom...

     use YAML 'LoadFile';
     use Path::Class 'file';

         LoadFile( file( MyApp->config->{home}, 'myapp.yml' ) ) );

Deployment can't be much easier... :)

> - In a similar vein, defining URLs directly in the code seems less
> flexible than doing it somewhere else, and makes Catalyst apps hard to
> relocate.  (Although of course mod_rewrite solves any URL  
> problem.)  Is
> there any alternate way of defining URL to method mappings?

Funny, everybody thinks it's much more flexible than everything else  
on the market.
And keep in mind that mod_rewrite is very platform specific, we  
support CGI, all versions of mod_perl, FastCGI, SpeedyCGI, Zeus and  

IMO, having the uri right next to your method (in code) makes the  
whole mapping dead simple.

     sub method : Path('/foo/bar') {}


     package MyApp::C::Foo;

     sub method {}

     RewriteEngine On

     RewriteRule ^/foo/bar$ /foo/method

Just look at the mess the Rails folks call Routes, it's horrible...

And in case you still don't like the actual dispatcher, subclass  
Catalyst::Dispatcher and do as you want, every single bit in Catalyst  
is exchangeable. ;)

> - Does all of this URL stuff work with the CGI engine?  I can imagine
> ways it might work using PATH_INFO, but the docs on how to configure a
> web server to use the different engines seem pretty slim.  Maybe I'm
> looking in the wrong place.

It works with all engines!
Yes docs are a bit slim, but Christian our machinist :) promised  
benchmarks and example configs for all platforms...lets hope this  
post motivates him some more!

> - None of the intro docs show any use of query args ( $c->req()- 
> >params
> () ) at all, and at first I wasn't sure it was even supported.  Is  
> this
> an intentional thing, to encourage people to use other approaches,  
> or is
> it just that URLs like /action27/thing13/ are more fun to write about?

Not intentional, patches are very welcome...
Most people just prefer using Catalyst::Plugin::FormValidator, so i  
guess thats why everybody overlooked it. ;)

> Thanks for your help with this.  I will probably have
> more questions
> later, but that should do it for now.

Just ask, or join #catalyst...


More information about the Catalyst mailing list