[Catalyst] Catalyst Actions precedence

Nick Anderson nick at webcraftcs.com
Thu Feb 28 09:25:39 GMT 2013


Hi Trevor,

Many thanks for clarifying that. I guess I was hoping for some reliable 
and predictable outcome for ambiguous requests but it seems the 
statement "Don't do this" in the URL Path handling section does indeed 
sum it up! And although it does not explicitly mention chained actions, 
I presume any URL path ambiguity should/must be avoided.

What I was trying to achieve was a catch-all facility for requests other 
than application defined actions, up to root level (i.e. for 
user-specified URLs which are then looked up in a database). For the 
life of me I can't remember why I avoided using the "default" action to 
achieve this, probably because I thought being more specific (even just 
by using a wildcard chain) was the most appropriate way to approach it 
and more structured.

I presume then, that having a /*/... wildcard action to catch everything 
else is not advisable? Is using the default action the preferred method 
then to allow for unknown/dynamic URLs where an application defined 
action is unavailable?

Thank you

Nick


On 27/02/13 22:34, Trevor Leffler wrote:
> Hi Nick,
>
> The best answer I've been able to find is "Don't Do This" from here:
>
> https://metacpan.org/module/Catalyst::Manual::Intro#URL-Path-Handling
>
> "Beware! If you write two matchers, that match the same path, with the 
> same specificity (that is, they match the same quantity of the path), 
> there's no guarantee which will actually get called."
>
> So you're right in your confusion with the scenario you wrote up: why 
> do action0 and actionx get matched, but action1 is ignored in favor of 
> (:Chained) pages?  Kieren's answer sort of side-stepped the issue by 
> inferring that all this goes away when you use the same matching 
> system, :Chained.  By leveling the playing field it all works as you 
> would expect.  I just (re-)skimmed the dwarves example, and 
> unfortunately it doesn't explicitly say *not* to mix :Chained with 
> other dispatch types.
>
> The Manual's summary statement above might also have been: "Once you 
> go :Chained, go :Chained all the way."  Or at least don't have a 
> wildcard chained action like pages() along with non-chained actions 
> and expect things to work predictably...  ;)
>
> --Trevor
>
>
> On 02/27/2013 01:20 PM, Nick Anderson wrote:
>> Hi,
>>
>> please could someone explain how Catalyst determines the precedence of
>> actions, specifically in relation to the following simple chained
>> example. It doesn't behave in the way I would expect for requests
>> numbered 4 and 6:
>>
>> 1. http://127.0.0.1:3001/action0 => Matched action 0
>> 2. http://127.0.0.1:3001/action0/abc => Matched XPages / pages
>> 3. http://127.0.0.1:3001/action1 => Matched XPages / pages
>> 4. http://127.0.0.1:3001/action1/abc => Matched XPages / pages
>> 5. http://127.0.0.1:3001/actionx => Matched action x
>> 6. http://127.0.0.1:3001/actionx/abc => Matched XPages / pages
>>
>> The controllers are detailed below:
>>
>> package TestApp::Controller::Root;
>> use Moose;
>> use namespace::autoclean;
>>
>> BEGIN { extends 'Catalyst::Controller' }
>>
>> __PACKAGE__->config(namespace => '');
>>
>> sub site_base :Chained :PathPart('') :CaptureArgs(0) {
>>      my ($self,$c ) = @_;
>> }
>>
>> sub action0 :Path('action0') :Args(0) {
>>      my ($self,$c ) = @_;
>>      $c->response->body( "Matched action 0" );
>> }
>>
>> sub action1 :Path('action1') :Args(1) {
>>      my ($self,$c ) = @_;
>>      $c->response->body( "Matched action 1" );
>> }
>>
>> sub actionx :Path('actionx') :Args() {
>>      my ($self,$c ) = @_;
>>      $c->response->body( "Matched action x" );
>> }
>>
>> sub end : ActionClass('RenderView') {}
>>
>> __PACKAGE__->meta->make_immutable;
>>
>> 1;
>>
>> package TestApp::Controller::XPages;
>> use Moose;
>> use namespace::autoclean;
>>
>> BEGIN {extends 'Catalyst::Controller'; }
>>
>> sub base : Chained( '/site_base' ) : PathPart('') : CaptureArgs( 1 ) {
>>      my ( $self, $c ) = @_;
>> }
>>
>> sub pages : Chained( 'base' ) : PathPart('') : Args() {
>>      my ( $self, $c ) = @_;
>>      $c->response->body('Matched XPages  / pages');
>> }
>>
>> __PACKAGE__->meta->make_immutable;
>>
>> 1;
>>
>>
>> Thanks for any help you can give
>>
>> Nick Anderson
>>
>> _______________________________________________
>> List: Catalyst at lists.scsys.co.uk
>> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
>> Searchable archive: 
>> http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
>> Dev site: http://dev.catalyst.perl.org/
>
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: 
> http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/




More information about the Catalyst mailing list