Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

CuteというWebフレームワークを作った

俺々フレームワークを作ってみたかったので、先人の知恵をいろいろ拝借する感じでやってみた。

いろいろ足りないものがあるけど、まあとりあえず動くところまで。自分の好み的に、わりといい感じになりつつあるので、今後は、個人用プロジェクトにはこれを使っていきたい。

いちファイルでこんなん書いたら適当に動く感じ。

package Example::Cute::Default;
use strict;
use warnings;

use Cute;

sub title {
    my ($self, $suffix) = @_;
    my $title  = 'Hello, Cute!';
       $title .= " ($suffix)" if $suffix;
       $title;
}

get '/' => sub {
    my ($self, $ctx) = @_;
};

get '/foo' => sub {
    my ($self, $ctx) = @_;
    $ctx->res->content($self->title('/foo'));
};

get '/bar/baz' => sub {
    my ($self, $ctx) = @_;
    $ctx->stash(
        title => $self->title('/bar/baz'),
        list  => [
            { value => 'foo' },
            { value => 'bar' },
            { value => 'baz' },
        ],
    );
};

get '/{year:[0-9]{4}}/{month:[0-9]{2}}' => sub {
    my ($self, $ctx) = @_;
    $ctx->response->set_template('path_query.html');
    $ctx->stash(
        year  => $ctx->req->path_query('year'),
        month => $ctx->req->path_query('month'),
    );
};

!!1;

んでもって、それだと規模が大きくなると見通しが悪くなりそうなので、Controller別にも分けられるようにもしてみた。::Contoler::Hogeみたいなのの中では、get/post/put/deleteが、自動的に/hoge以下を指すようになる。

package Example::Cute::Default::Controller::Hoge;
use strict;
use warnings;

use Cute 'Example::Cute::Default';

get '/' => sub {
    my ($self, $ctx) = @_;
    $ctx->res->content($self->title('/hoge'));
};

get '/fuga' => sub {
    my ($self, $ctx) = @_;
    $ctx->stash(
        title => $self->title('/hoge/fuga'),
        list  => [
            { value => 'foo' },
            { value => 'bar' },
            { value => 'baz' },
        ],
    );
};

!!1;

上の例は以下から見ることができる。