[Catalyst] Catalyst Actions precedence

Nick Anderson nick at webcraftcs.com
Wed Feb 27 22:19:16 GMT 2013


Hi Kieren,

Thanks for the quick reply.

I hadn't missed out chained("site_base"), as I didn't want those actions 
to to be part of any chain. But what I did expect was the Args(1) action 
(request 4) to behave in the same way as Args(0) (request 1) which it 
doesn't and instead ends up going to the chained action in XPages. It 
didn't seem consistent/predictable to me?

Thank you for the book link which will be useful. I do have a fairly 
good understanding of the chained process but this specific example 
seemed to throw up an anomaly where the request could equally be 
satisfied by the chained action or the normal action but the chained 
action took precedence except when 0 args were specified. Is Args(0) a 
special case? Is there not an order of precedence for resolving requests 
specified somewhere?

Thanks,

Nick


On 27/02/13 21:50, Kieren Diment wrote:
> On 28/02/2013, at 8:20 AM, Nick Anderson<nick at webcraftcs.com>  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 ) = @_;
>> }
>>
> You seem to have missed :Chained('site_base') from all the sub attributes below.
>
> Check the DwarfChains app in the catalyst book code (chapter 7 available from - http://www.apress.com/downloadable/download/sample/sample_id/205/ ) for an example along the same lines of yours that works.
>
>> 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