I just wanted to comment on Number 3, here. Scroll down ;-)

kyle dawkins wrote:
> 
> Fran (et al)
> 
> I've stayed out of the MVC chitchat for a long time (very interesting
> thread) because it's such a deep topic.  But seeing as how Fran has
> some concrete questions...
> 
> > 3.  How do you prevent a Controller from just becoming another big if
> > statement, or is this their purpose in life?
> 
> See Jeff's previous mail.  Your structure is crying out for a dispatch
> table; Jeff suggests building this out of a hash that defines what
> actions to perform based on what your query values are.  That's a great
> place to start.   GET RID OF YOUR BIG "IF" STATEMENT ASAP.
> 

If I read this right, then it's something I am already doing and I'll
throw it in here to show:

## My idea of a dispatch table!
my %actions = (
    'view'     => 'FES::Control::View',
    'logout'   => 'FES::Control::Logout',
    'edit'     => 'FES::Control::Edit',
    'notes'    => 'FES::Control::Notes',
    'save'     => 'FES::Control::Save',
    'calendar' => 'FES::Util::Calendar',
    );
 
sub handler {
    my $r = Apache::Request->new(shift);
 
## BEGIN ignore (DECLINE) image requests and allow regular apache to
handle them.
    return DECLINED if $r->content_type =~ /image/;
## END ignore image requests
 
    my $act = $r->param('act') || 'view';
 
    if (my $h = $actions{$act}) {
        $r->push_handlers(PerlHandler => $h);
        $r->handler('perl-script');
        return DECLINED;
    } else {
        my $stmt = "There is no such action as \'" . $act . "\'\n";
        $r->pnotes('error', $stmt);
        $r->push_handlers(PerlHandler => 'FES::Error::Error');
        $r->handler('perl-script');
        return DONE;
    } ## end else [ if (my $h = $actions{$act...
}
1;

That's how I impliment at least _part_ of my controller without
resorting to huge IF statements.

Is this what was meant guys?

--Jon R.

If this is overly simplistic, or not what you meant, feel free to smack
me around.

Reply via email to