M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2011年2月20日 19:22

CGI::Applicationで、セッションオブジェクトをテンプレートエンジンに自動で渡す

このエントリーをはてなブックマークに追加 mixiチェック

CGI::Applicationで、セッションオブジェクトに入れておいたパラメータをそのままテンプレートエンジンに渡すとき、

package TEST;
 
use strict;
use warnings;
use utf8;
use base 'CGI::Application';
use CGI::Session qw(-ip_match);
use CGI::Application::Plugin::Session;
 
sub cgiapp_init {
  my ($self) = @_;
  $self->session_config(
    CGI_SESSION_OPTIONS => [
      'driver:File',
      $self->query,
      { Directory => 'session_dir' },
    ],
    COOKIE_PARAMS => {
      -path    => '/',
      -expires => '+1h',
    },
    SEND_COOKIE => 1,
  );
  $self->query->charset('UTF-8');
}
 
sub setup {
  my $self = shift;
  $self->start_mode('index');
  $self->run_modes(
    index     => 'index',
  );
  $self->header_add( -charset => 'UTF-8');
}
 
sub index {
  my $self = shift;
  my $s = $self->session;
  my $t = $self->load_tmpl( 'index.tmpl' );
  $t->param( hoge => 'fuga');
  $t->param( $s->param_hashref() );
  return $t->output;
}
 
1;

こんな感じで書くことができます。でも、例えばサイトにログイン中はセッションオブジェクトにユーザIDなどが入ってるなどした場合、各RumModeで毎回$t->param( $s->param_hashref() );を書くのは面倒……

そんな時は、テンプレートエンジンのフックを使ってこうしてみましょう。

package TEST;
 
use strict;
use warnings;
use utf8;
use base 'CGI::Application';
use CGI::Session qw(-ip_match);
use CGI::Application::Plugin::Session;
 
sub cgiapp_init {
  my ($self) = @_;
  $self->session_config(
    CGI_SESSION_OPTIONS => [
      'driver:File',
      $self->query,
      { Directory => 'session_dir' },
    ],
    COOKIE_PARAMS => {
      -path    => '/',
      -expires => '+1h',
    },
    SEND_COOKIE => 1,
  );
  $self->query->charset('UTF-8');
  $self->add_callback('load_tmpl',\&load_tmpl_callback);
}
 
sub setup {
  my $self = shift;
  $self->start_mode('index');
  $self->run_modes(
    index     => 'index',
  );
  $self->header_add( -charset => 'UTF-8');
}
 
sub index {
  my $self = shift;
  my $s = $self->session;
  my $t = $self->load_tmpl( 'index.tmpl' );
  $t->param( hoge => 'fuga');
  return $t->output;
}
 
sub load_tmpl_callback {
  my ($self, $ht_params, $tmpl_params, $tmpl_file) = @_;
  my $s = $self->session;
  $ht_params->{'die_on_bad_params'} = 0;
  
  # 各RumModeで$t->param( $s->param_hashref() );する代わり
  my $s_hashref = $s->param_hashref();
  foreach my $key ( keys %$s_hashref ) {
    next if $key =~ m/^_/;
    next if $key =~ m/access_token/i;
    $tmpl_params->{ $key } = $s_hashref->{ $key };
  }
  return;
}
 
1;

セッションオブジェクトの中に、テンプレートエンジンに渡してはならないものもあると思うので、ブラックリストを使って排除するのは必要かなあと思います(next if~を羅列する)。

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3503

コメントする