MVCその8
続き。
検索する、というModelはできたので、Controllerの実装に移る。
lib/MyHatena/Web/Controller/Root.pm
PODは省略。
package MyHatena::Web::Controller::Root; use Moose; use namespace::autoclean; BEGIN { extends 'Catalyst::Controller' } __PACKAGE__->config(namespace => ''); sub index :Path :Args(0) { my ($self, $c) = @_; $c->stash->{template} = 'index.tt'; } sub default :Path { my ($self, $c) = @_; $c->response->body( 'Page not found' ); $c->response->status(404); } sub end : ActionClass('RenderView') {} __PACKAGE__->meta->make_immutable; 1;
lib/MyHatena/Web/Controller/Search.pm
PODは省略。
package MyHatena::Web::Controller::Search; use Moose; use namespace::autoclean; BEGIN { extends 'Catalyst::Controller' } sub search :Path('/search') { my ($self, $c) = @_; # Model->search my $result = $c->model('Tag::Search')->search($c->req->param('search_tag')); $c->stash->{template} = 'search.tt'; $c->stash->{result} = [$result->entries]; $c->stash->{search_tag} = $c->req->param('search_tag'); } __PACKAGE__->meta->make_immutable;
Path指定で、Controllerのファイル名にかかわらず、一番上のパスが割り当てられる。
つまり
sub search :Path('/search') {
は、
http://localhost:3000/search
でディスパッチされる。
Root.pmに sub search :Local と書くのと同じ(だと思う)。
あとは、end で実行されるレンダリング用のViewか。