[Catalyst] proper flow control with $c->foward, in search of
greater grok
Tomas Doran
bobtfish at bobtfish.net
Fri Jan 8 14:55:43 GMT 2010
Dennis Daupert wrote:
> It seems that when chained path parts increase beyond two links,
> addressing actions directly doesn't work quite as well. For example, I
> have these:
>
> User.pm
> User::Blog.pm
> User::Blog::Entry.pm
>
> After I add an entry to blog 'x' for user 'y', I can transport over to
> the entries list for blog 'x' like so:
>
> $c->forward($c->controller('My::Controller::User::Blog::Entry')->action_for('list'),
> [ @args ]);
> $c->detach;
Right, but forward visits _one action_, only..
> Or less elegantly, like so:
> $c->response->redirect($c->uri_for("/user/$user_id/blog/$blog_id/entry/list"));
Eww, don't do that.
You want
$c->response->redirect($c->uri_for_action('/user/blog/entry/list',
[$user_id, $blog_id]));
And it should be noted that redirect and forward are _totally_ different
things, used for totally different purposes.
>
> But I can't seem to _go_ to the list (this doesn't work -- I get
> 'invalid ID'):
> $c->go( 'My::Controller::User::Blog::Entry', 'list', [ \@captures,
> \@args ] );
Not specific enough. You get 'invalid ID' where, from what?
Please show use the debug table from app startup and for the hit in
question which has the issue?
At a guess what you're doing wrong is not ->go ing to the end of the
chain - you can _only_ go to chain endpoints (rather than individual
actions) as go does a full redispatch.
> Are there built-in limits to number of chained links we can dispatch by
> way of directly addressing actions?
No.
> Any rules/tips/guidelines in
> multiple chained situations?
DO NOT CONSTRUCT PATHS MANUALLY.
USE ACTION OBJECTS OR uri_for_action.
That is all :)
Cheers
t0m
More information about the Catalyst
mailing list