[Catalyst] Catalyst Actions precedence

Trevor Leffler tleffler at uw.edu
Wed Feb 27 22:34:36 GMT 2013


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/



More information about the Catalyst mailing list