NAME

CatalystX::Resource - Provide CRUD functionality to your Controllers

VERSION

version 0.03

SYNOPSIS

use Catalyst qw/
    +CatalystX::Resource
/;

__PACKAGE__->config(
    'Controller::Resource::Artist' => {
        resultset_key => 'artists',
        resource_key => 'artist',
        form_class => 'TestApp::Form::Resource::Artist',
        model => 'DB::Resource::Artist',
        error_path => '/error',
        actions => {
            base => {
                PathPart => 'artists',
            },
        },
    },
    'CatalystX::Resource' => {
        controllers => [ qw/ Artist / ],
     },
 );

DESCRIPTION

CatalystX::Resource enhances your App with CRUD functionality.

After creating files for HTML::FormHandler, DBIx::Class and Template Toolkit templates you get create/edit/delete/show/list actions for free.

Resources can be nested. (e.g.: Artist has_many Albums)

traits

default

List ... GET /<resource>/list
Show ... GET /<resource>/*/show
Delete ... POST /<resource>/*/delete
Form
Create ... GET|POST /<resource>/create
Edit ... GET|POST /<resource>/*/edit

optional

MergeUploadParams
Sortable
POST /<resource>/*/move_next
POST /<resource>/*/move_previous
POST /<resource>/*/move_to

You can remove actions if you don't need them.

Example, you don't need the edit action: 'Controller::Resource::Artist' => { ..., traits => ['-Edit'], },

Use the Sortable trait to make your resources sortable: 'Controller::Resource::Artist' => { ..., traits => ['Sortable'], },

CONFIG

controllers

array ref of controller names which will be injected into your app

error_path

CatalystX::Resource detaches to $self->error_path if a resource cannot be found. Make sure you implement this action in your App. (default: '/default')

CAVEAT

Using Moose Method Modifiers on your Resource Controller

If you want to apply Method Modifiers to a resource controller you have to subclass from CatalystX::Resource::Controller::Resource and apply the roles in a BEGIN block.

The following example loads the List trait via with in order to apply a before method modifier.

package MyApp::Controller::Foo;
use Moose;
use namespace::autoclean;

__PACKAGE__->config(
    resultset_key => 'artists',
    resource_key  => 'artist',
    form_class    => 'TestApp::Form::Resource::Artist',
    model         => 'DB::Resource::Artist',
    traits        => [qw/ MergeUploadParams -Delete /],
    error_path    => '/error',
    actions       => {
        base => {
            PathPart => 'artists',
        },
    },
);

BEGIN {
    extends 'CatalystX::Resource::Controller::Resource';
    with 'CatalystX::Resource::TraitFor::Controller::Resource::List';
    with 'CatalystX::Resource::TraitFor::Controller::Resource::Show';
    with 'CatalystX::Resource::TraitFor::Controller::Resource::Form';
    with 'CatalystX::Resource::TraitFor::Controller::Resource::Create';
    with 'CatalystX::Resource::TraitFor::Controller::Resource::Edit';
    with 'CatalystX::Resource::TraitFor::Controller::Resource::Sortable';
}

before 'list' => sub { ... }

1;

Because of a bug in MooseX::MethodAttributes CatalystX::Resource::TraitFor::Controller::Resource::MergeUploadParams is not applied correctly if you include it via with in the BEGIN block of the subclassed controller.

Including it via traits => ['MergeUploadParams'] works around this.

MergeUploadParams is different from the other roles. The other roles add a subroutine whereas MergeUploadParams uses a Moose Method Modifier.

SEE ALSO

Check out Catalyst::Controller::DBIC::API if you want to provide your data as a web service.

AUTHOR

David Schmidt <davewood@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by David Schmidt.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.