読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

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か。