24
最近のSledgeについて id:clouder

Sledge recently in Yokohama.pm Aug, 2008

Embed Size (px)

Citation preview

最近のSledgeについてid:clouder

self-introduction• id clouder• 本名 栗原 由樹• livedoor 所属• HTTP::MobileAgent Imager::QRCode etc...

今日話すこと

•簡単な紹介• livedoorでの最近の使い方

今日話さないこと

•インストール方法•詳しい使い方

• Perlで出来た純国産Webアプリケーションフレームワーク

• 2003年2月13日リリース•最新版はバージョン1.11• http://sl.edge.jp/

Sledgeとは

•弊社では今でも現役バリバリです• Sledgeを使ってるっぽい会社

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/

など、どこからでもよいのでコンタクトを取ってくださいませ。

お待ちしております!

以上です質問はありますか?