Perl日記

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

MVCその8.5

少し続き。
Contorollerだけど、わざわざ

$c->stash->{template} = 'index.tt';


なんてしなくてもよいことを思い出した。
Catalystやってみた - Perl日記
以前にやってた。
というかここで何をやっていたかというのがやっと分かった次第。
つまりは、Controllerでディスパッチした中でテンプレートが指定されていなかったら(bodyがなかったらともいうのかな)、そのアクション名をテンプレートファイル名として使用する、ということ。
テンプレートの拡張子は、TTクラスで指定する。(デフォルトで'.tt'でされてた。)

lib/MyHatena/Web/View/TT.pm

package MyHatena::Web::View::TT;
use strict;
use warnings;
use base 'Catalyst::View::TT';
__PACKAGE__->config(TEMPLATE_EXTENSION => '.tt');


ゆえに、前回のControllerはその点を省略してこう書ける。

lib/MyHatena/Web/Controller/Root.pm

sub index :Path :Args(0) {
# my ($self, $c) = @_;
# $c->stash->{template} = 'index.tt';
}


書けるというか書いてないというか。
まあDocRootの最初の最初ということで、別にサブルーチンの名前は index() じゃなくてもディスパッチされるのだけれど、お決まりごと的におまじない的に、index()という名前にして、index.ttをテンプレートとするようにしている。

lib/MyHatena/Web/Controller/Search.pm

sub search :Path('/search') {
  my ($self, $c) = @_;
  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');
}


コメントアウトのこれだけでいいかなと考えていたけれど、よく見たらSearch.pmのsearchアクションなので、このままだとTTは root/search/search.ttを見に行ってしまう。(そうするべきなのかもだけど)
root/search.ttをテンプレートとして使いたいので、何とかしないといけない。
要は名前空間に対する相対関係をなくせばいいわけだ。

__PACKAGE__->config(namespace => '');


うーん。
これをSearch.pmの上の方に入れてみたものの、なんだろ、Root.pmでもnamespace消し去ってるし、あんまり良くないのかな?、これ……。
何か設定できそう。