Sledge recently in Yokohama.pm Aug, 2008
-
Upload
yoshiki-kurihara -
Category
Technology
-
view
3.772 -
download
0
Transcript of Sledge recently in Yokohama.pm Aug, 2008
• Perlで出来た純国産Webアプリケーションフレームワーク
• 2003年2月13日リリース•最新版はバージョン1.11• http://sl.edge.jp/
Sledgeとは
dispatcher処理(昔).cgiファイル#!perluse strict;use App::Pages::Root;App::Pages::Root->dispatch(‘index’);
もしくはSledge::Dispatcher<Location /webapp>SetHandler perl-scriptPerlHandler Sledge::Dispatcher::PropertiesPerlSetVar SledgeMapFile /path/to/map.properties</Location>
dispatcher処理(今)Sledge::Engineを使用<Location /webapp>SetHandler perl-scriptPerlHandler App</Location>
dispatchはApp.pmpackage App;use strict;use Sledge::Engine;__PACKAGE__->setup;
dispatcher処理(今)App/{CMS,Admin}.pmなど機能別に使い分け# App/CMS.pmpackage App::CMS;use strict;use Sledge::Engine;__PACKAGE__->setup;
# modperl.conf<Location /webapp-cms>SetHandler perl-scriptPerlHandler App::CMS</Location>
Config処理(昔)Sledge::Configを使用# lib/App/Config/_test.pmpackage App::Config::_test;use strict;use vars qw(%C);*Config = \%C;
$C{TMPL_PATH} = '/path/to/view';$C{DATASOURCE} = [ 'dbi:mysql:appdb','root', '' ];
_test.pm や _production.pm などファイルで環境を使い分ける
Config処理(今)独自に実装しYAML形式で記述# config.yamltest:tmpl_path: /path/to/viewdatasource:
- dbi:mysql:testdb...
production:tmpl_path: /path/to/viewdatasource:
- dbi:mysql:proddb...
1ファイルで環境を棲み分け
テンプレート処理(昔)Sledge::Templateベース# テンプレートへの値の渡し方$self->tmpl->param(foo => ‘bar’);
# テンプレートファイルの選択はguess_filename()に任せるか$self->load_template(‘index.html’);
テンプレート処理(今)Sledge::Viewを利用# PagesのベースクラスでSledge::Plugin::Viewをuseするpackage App::Pages;use strict;use Sledge::Plugin::View;sub create_view { App::View::TT->new( shift ) }
# App/View/TT.pmを用意(JSON.pmやRSS.pmなど使い分け)package App::View::TT;use strict;use base qw( Sledge::View );
sub process { ... }sub render { ... }
テンプレート処理(今)Sledge::Plugin::Stashを利用# テンプレートへの値の渡し方$self->stash->{ foo } = ‘bar’;
# テンプレートファイルも stash に$self->stash->{ template } = ‘/path/to/index.html’;# もしくは__PACKAGE__->register_hook(
AFTER_DISPATCH => sub {my $self = shift;$self->stash->{ template }
= $self->guess_filename( $self->page );}
);
Validation処理(昔)ページ毎にApp::Validator::PageNameを作成# App::Validator::Baseで validate を定義package App::Validator::Base;
sub validate { my($self, $page) = @_; $self->normalize($page); my($status, $stuff) = $self->do_validate($page); $page->tmpl->param(errors => $stuff) if $status == FAIL; return $status, $stuff;}
Validation処理(昔)ページ毎にApp::Validator::PageNameを作成# App::Validator::PageNameでdo_validate()を定義package App::Validator::PageName;
sub do_validate { my($self, $page) = @_; ... if (成功) { return SUCCESS, undef } else { return FAIL, $errobj; }}
Validation処理(今)Data::FormValodatorを利用# App::PagesやApp::Data::Baseなどにvalidate()を定義sub validate { my($self, $name) = @_; unless ($name) { $name = join '_', $self->prefix, $self->page; $name =~ s{/}{_}g; $name =~ s{^_}{}; } my $profiles = $self->path_to('etc', 'dfv.pl')->stringify; my $dfv = Data::FormValidator->new($profiles, { missing_optional_valid => 1, msgs => &dfv_messages_handler($name), }); my $form = eval { $dfv->check($self->r, $name); }; $self->stash->{form} = $form; $form;}
Validation処理(今)ちなみにetc/dfv.plは普通な感じですuse strict;use Data::FormValidator::Constraints qw(:closures);
return +{ page1 => { required => [qw(username password)], constraint_methods => { username => qr/^[a-zA-Z0-9]{4,8}$/, }, }, page2 => { required => [qw(foo bar)], optional => [qw(baz) ], constraint_methods => { foo => qr/^[01]$/, }, },};
Validation処理(今)PagesもしくはDataクラスからvalidate()する# フォームのある各ページのPagesでvalidate()をコールpackage App::Pages::Foo;
sub dispatch_index { my $self = shift; my $form = $self->validate; if ( $form->success ) { # 成功 } else { # エラー }}
Validation処理(今)PagesもしくはDataクラスからvalidate()する# Dataオブジェクト経由validate()をコールpackage App::Pages::Foo;
sub dispatch_index { my $self = shift; my $obj = App::Data::User->new($self->r); my $form = $obj->validate; if ( $form->success ) { # 成功 } else { # エラー }}
エンジニア募集中現在livedoorでは一緒に働いてくれるエンジニアを募集しています。
もし興味のある方は、clouder at gmail.com
やhttp://recruit.livedoor.com/
など、どこからでもよいのでコンタクトを取ってくださいませ。
お待ちしております!