[僕] CC::Resources と CC::RequestToken を一緒に使う

僕ト云フ事

たろマークはてなブックマーク

2008年10月28日

[catalyst][perl] CC::Resources と CC::RequestToken を一緒に使う

追記

Controller::Resources の作者に対応してもらったよ!ありがとう!

ここから元の記事

Catalyst::Plugin::RequestToken が廃止対象になって Catalyst::Controller::RequestToken が出てからだいぶ経ちましたが、Resources とどう組み合わせて使おうか悩んでいて、こうやったら一緒に使えるなぁと思ったのでやってみた。

package MyApp::Base::Controller::Resources;
 
use strict;
use warnings;
use base qw(Catalyst::Controller::Resource Catalyst::Controller::RequestToken);
 
use Catalyst::Utils;
 
sub setup_collection_actions {
    my $self = shift;
 
    my $maps = Catalyst::Utils::merge_hashes(
        $self->{collection} || {},
        {   list      => { method => 'GET',  path => '',    token => 'create' },
            do_create => { method => 'POST', path => '',    token => 'validate' },
            create    => { method => 'GET',  path => 'new', token => 'create' },
        }
    );
    $self->setup_actions( collection => $maps );
}
 
sub setup_member_actions {
    my $self = shift;
 
    my $maps = Catalyst::Utils::merge_hashes(
        $self->{member} || {},
        {   show       => { method => 'GET',  path => '',       token => 'create' },
            do_update  => { method => 'POST', path => 'update', token => 'validate' },
            update     => { method => 'GET',  path => 'update', token => 'create' },
            do_destroy => { method => 'POST', path => 'delete', token => 'validate' },
            destroy    => { method => 'GET',  path => 'delete', token => 'create' },
        }
    );
    $self->setup_actions( member => $maps );
}
 
sub _construct_action_attributes {
    my ( $self, $chained_from, $map ) = @_;
 
    return (
        'Resource',
        'Args(0)',
        "Chained('$chained_from')",
        "Method('$map->{method}')",
        exists $map->{path} ? "PathPart('$map->{path}')" : 'PathPart',
        ( exists $map->{token} && $map->{token} eq 'create' )   ? 'CreateToken'
      : ( exists $map->{token} && $map->{token} eq 'validate' ) ? 'ValidateToken'
                                                                : ''
    );
}

_construct_action_attributes を上書きして、$map->{token} に入っている値を見て、CreateToken か ValidateToken アトリビュートを付加するようにしてます。

後は setup_(collection|member)_actions で token の指定するだけ。
list と show を CreateToken にしてるのは、一覧画面とか詳細画面自体にフォームがある場合があるからです。

トラックバック

このエントリーのトラックバックURL:
http://vkgtaro.jp/cgi-bin/mt/mt-tb.cgi/642

コメントを投稿