[Catalyst] Dispatch matching more than the path?

John Napiorkowski jjn1056 at yahoo.com
Wed Sep 6 22:35:31 CEST 2006


Garrett,

Looks like we are working on something similar.  I
hadn't noticed your postings about two weeks about (I
was in the middle of moving from Beijing back to the
USA and missed about a week of Catalyst postings) or I
might have saved time asking the same questions you
asked.

I'm actually doing this as an Action class.  Since I
don't find any additional posts I'm not sure your
status.  Want to collaborate?  I am also very
interested in REST based services and would enjoy
having someone to bounce ideas off of.

--john


--- Garrett Goebel <ggoebel at goebel.ws> wrote:

> On Aug 22, 2006, at 3:49 AM, Matt S Trout wrote:
>  > > Garrett Goebel wrote:
>  > >
>  > > I hacked something into the Path and Regex
> dispatchers to get  
> collective
>  > > matching on method and path working in the
> prototype.
>  >
>  > You shouldn't need to hack anything into these;
> just use a custom  
> ActionClass
>  > that overrides $action->match to introspect onto
> the request  
> method and
>  > anything else you need (this is already how :Args
> is handled, see the
>  > Catalyst::Action source for the implementation).
> 
> Thanks. I'd found the :Args code in Catalyst::Action
> last night and  
> managed to shoehorn the request method and path
> parameter matching  
> checks into it. How to subclass or override it was
> going to be my  
> next question. I'll check out using a custom
> ActionClass.
> 
> Last night I also sub-classed the Request class to
> add:
> __PACKAGE__->mk_accessors(qw/path_parameters
> accept_extension/);
> 
> And I'm currently subclassing the Dispatcher to
> override  
> prepare_action in order to:
> o  remove uri path parameters from $c->request->path
> and add to
>     $c->request->path_parameters
> o  remove "file" extension from last path segment
> and add to
>     $c->request->accept_extension
> o  filter body parameters from using content_type
> implied by the
>     accept_extension (json, yaml, etc) and add to
> $c->request- 
>  >parameters.
>     Perhaps I should consider just using the
> $c->request->content_type?
> o  check POST requests for hidden _method=DELETE|PUT
> parameter and  
> update
>     $c->request->method accordingly
> 
> These are all things I want to do once per request,
> not once per  
> action. Certainly there are better places to perform
> some of these  
> tasks. And I would like to hear any advice on the
> best place to  
> override catalyst for each. In the mean time, at
> least I've got a  
> proof of concept working.
> 
> 
> My controller now is able to look like:
> 
> # GET http://foo.com/model
> # GET http://foo.com/model.json
> sub index :GET :Path('') Args(0) {
>      my ($self, $c) = @_;
>      my @models = grep {
> UNIVERSAL::can($c->model($_),  
> 'result_source') }
>                   $c->models;
>      $self->out($c, \@models);
>      1;
> }
> 
> # GET http://foo.com/model/Person
> sub show :GET :Path('') :Args(1) {
>      my ($self, $c, $model) = @_;
>      my @pkcols =
> $c->model($model)->result_source->primary_columns;
>      my @pk_tuples = map(
>          { my $tuple = $_; csv_encode(map({
> $tuple->$_ } @pkcols)) }
>          $c->model($model)->search(undef,
>                                    {columns  =>
> \@pkcols,
>                                     distinct => 1,
>                                     order_by =>
> \@pkcols})
>      );
>      $self->out($c, \@pk_tuples);
>      1;
> }
> 
> # GET http://foo.com/model/Person;edit
> sub edit :GET :Path('') :PathParam(edit) :Args(1)
> {...}
> 
> # GET http://foo.com/model/Person;add
> sub add :GET :Path('') :PathParam(add) :Args(1)
> {...}
> 
> 
> # GET http://foo.com/model/Person;column_info
> # GET http://foo.com/model/Person.yaml;column_info
> sub show_column_info :GET :Path('')
> :PathParam(column_info) :Args(1) {
>      my ($self, $c, $model) = @_;
>      my $rs  = $c->model($model)->result_source;
>      my %column_info = map { $_ =>
> $rs->column_info($_)} $rs->columns;
>      $self->out($c, \%column_info);
>      1;
> }
> 
> # POST http://foo.com/model/Person;new
> sub create :POST :Path('') :PathParam(new) :Args(1)
> {...}
> 
> # PUT http://foo.com/model/Person/32
> sub update :PUT :Path('') :Args(2) {...}
> 
> # DELETE http://foo.com/model/Person/32
> sub destroy :DELETE :Path('') :Args(2) {...}
> 
> 
> 
> 
> 
> 
> 
> _______________________________________________
> List: Catalyst at lists.rawmode.org
> Listinfo:
> http://lists.rawmode.org/mailman/listinfo/catalyst
> Searchable archive:
>
http://www.mail-archive.com/catalyst@lists.rawmode.org/
> Dev site: http://dev.catalyst.perl.org/
> 


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 



More information about the Catalyst mailing list