Catalyst Advent - Day 16 - Adding RSS feeds
Adding RSS feeds to your stuff in Catalyst is really simple. I'll show two different aproaches here, but the basic premise is that you forward to the normal view action first to get the objects, then handle the output differently
Using TT templates
This is the aproach we chose in Agave (http://dev.rawmode.org/).
sub rss : Local { my ($self,$c) = @_; $c->forward('view'); $c->stash->{template}='rss.tt'; }
Then you need a template. Here's the one from Agave: http://svn.rawmode.org/repos/Agave/trunk/root/base/blog/rss.tt
As you can see, it's pretty simple.
Using XML::Feed
However, a more robust solution is to use XML::Feed, as we've done in this Advent Calendar. Assuming we have a 'view' action that populates 'entries' with some DBIx::Class/Class::DBI iterator, the code would look something like this:
sub rss : Local { my ($self,$c) = @_; $c->forward('view'); # get the entries my $feed = XML::Feed->new('RSS'); $feed->title( $c->config->{name} . ' RSS Feed' ); $feed->link( $c->req->base ); # link to the site. $feed->description('Catalyst advent calendar'); Some description # Process the entries while( my $entry=$c->stash->{entries}->next ) { my $feed_entry = XML::Feed::Entry->new('RSS'); $feed_entry->title($entry->title); $feed_entry->link( $c->uri_for($entry->link) ); $feed_entry->issued( DateTime->from_epoch(epoch => $entry->created) ); $feed->add_entry($feed_entry); } $c->res->body( $feed->as_xml ); }
A little more code in the controller, but with this approach you're pretty sure to get something that validates. One little note regarding that tho, for both of the above aproaches, you'll need to set the content type like this:
$c->res->content_type('application/rss+xml');
Final words
Note that you could generalize the second variant easily by replacing 'RSS' with a variable, so you can generate Atom feeds with the same code.
Now, go ahead and make RSS feeds for all your stuff. The world *needs* updates on your goldfish!
-- Marcus Ramberg