Hatena::Groupcatalyst

masaki@catalyst RSSフィード

Fork me on GitHub
 | 

2007-06-17

Controller

| 21:56 | Controller - masaki@catalyst を含むブックマーク はてなブックマーク - Controller - masaki@catalyst Controller - masaki@catalyst のブックマークコメント

d:id:tomyhero:20070614:1181835761

新規リソース生成部分だと,最近落ち着いてきたのはこんな感じ.

package MyApp::Controller::Resource;

use HTTP::Status;

sub index : Path Args(0) ActionClass('REST') {}

sub index_not_implemented {
    my ($self, $c) = @_;

    $c->res->header(Allow => [qw( POST )]);
    # 405 Method Not Allowed
    $c->throw_exception(RC_METHOD_NOT_ALLOWED);
}

sub index_POST {
    my ($self, $c) = @_;

    $c->authentication_required;

    my $ct = $c->req->content_type;
    $ct eq 'application/atom+xml'              ? $self->create_from_atom($c) :
    $ct eq 'application/x-www-form-urlencoded' ? $self->create_from_form($c) :
    $ct eq 'multipart/form-data'               ? $self->create_from_form($c) :
    # 415 Unsupported Media Type
    $c->throw_exception(RC_UNSUPPORTED_MEDIA_TYPE);
}

sub create_from_form {
    my ($self, $c) = @_;

    if ($c->form->has_error) {
        $c->stash->{notice} = $c->form->messages($c->validator_profile);
        # 400 Bad Request
        $c->throw_exception(RC_BAD_REQUEST);
    }

    # do like insert data to db...

    my $created_resource_uri = $c->uri_for('...');
    # 303 See Other
    $c->res->redirect($created_resource_uri, RC_SEE_OTHER);
}
  • throw_exceptionはアプリケーションクラスに自前で定義.
  • authentication_requiredも同様.Auth::Cred::HTTPかAuth::Store::HTTPに同じ(ような)名前のメソッドがあるけどそれではない.
    • 加えて権限が必要な場合用にauthorization_requiredを作ってある.
  • ActionClass('REST') (in C::Action::REST)を使ってる.けどC::Controller::RESTは使ってない.

あと全体的に気をつけてるのは,リクエストレスポンス共に,HTTPメソッドやヘッダをフル活用してRESTfulになるように,ということ.

tomyherotomyhero2007/06/17 23:49HTTP::Statusを活用しているところがかっこいいですね!

トラックバック - http://catalyst.g.hatena.ne.jp/ikasam_a/20070617
 |