November 04, 2005
先日の Shibuya.pm テクニカルトーク #6 で、やっぱり注目のフレームワークは Catalyst なんだなぁーって思いつつ、日頃から Sledge を使っているせいか、あまり良さや真新しさを感じなかったりして。
「メタフレームワーク」という存在定義っぽいので、Catalyst のそれ自体は割と貧相。
なのに Helper まわりとかは妙にゴージャス & 拡張されているので、やる事や Model が決まってればすぐに使え、そうじゃない場合はすぐ使えなさそう。
Rails の対抗馬なのかも知れないですが、Rails な人が wink とか使ってアジャイル開発とか言って見せびらかしているようなのを真似するには向かないかも知れないですね。
まぁ Sledge も Model に制約がなかったりするのでまず向かないですが「10 分でブックマーク作れ」とか言われたら出来るかも知れん。
Catalyst で scaffold で CRUD フンフンって、あんまよくわかってないです、そんなのをやればサックリ出来るんでしょうかねぇ。
まぁ、弊社社内にある Class::DBI と連携して動く某 Sledge Plugin (未公開) を使えば出来るかも知れん。
Catalyst は、元々 Simon Cozens が作った Maypole から派生した MVC フレームワークだと記憶していますけど、Maypole が出た時は「Sledge に良く似てるなー」って印象でした。Catalyst 自体はそこから更にスマートにして制約を落とす方向に、Maypole は制約を上げてお手軽実装出来るように進化したかも知れないです。
制約の度合を表現すると
こんな感じでしょうか。
制約がキツくなく、でもある程度決まりきった処理をサクっと実装するには、Catalyst より Sledge のほうが上な気がしますが、Catalyst には Helper が充実しているから、とっつきやすいのかも知れませんが、そう言や Six Apart のせきむらさんが、Sledge Helper を作られてたなぁーとか思いました。
httpd も入ってます。
ちなみに、Sledge の場合
ちなみに普段は
んで、何が言いたいんかと言えば、Catalyst いいなーとか言っている人に対し、今まで Sledge のドキュメントってまともなのが無かったので、ちょっと書いてみるかぁって意気込みを見せてみようかと思いました。
「Sledge とか存在は知っているけど、ドキュメントが無いから Sledge 使ったこと、使おうと思ったことがない」って人多いんでしょうねぇ。
まぁぶっちゃけ、Prototype とかと一緒で「ソース嫁」が基本スタンスなんですけどね。
ってことで、Shibuya.pm から発生した、にわか Catalyst マンセームードに反抗すべく、Sledge ドキュメントを書いてみるであります。
「メタフレームワーク」という存在定義っぽいので、Catalyst のそれ自体は割と貧相。
なのに Helper まわりとかは妙にゴージャス & 拡張されているので、やる事や Model が決まってればすぐに使え、そうじゃない場合はすぐ使えなさそう。
Rails の対抗馬なのかも知れないですが、Rails な人が wink とか使ってアジャイル開発とか言って見せびらかしているようなのを真似するには向かないかも知れないですね。
まぁ Sledge も Model に制約がなかったりするのでまず向かないですが「10 分でブックマーク作れ」とか言われたら出来るかも知れん。
Catalyst で scaffold で CRUD フンフンって、あんまよくわかってないです、そんなのをやればサックリ出来るんでしょうかねぇ。
まぁ、弊社社内にある Class::DBI と連携して動く某 Sledge Plugin (未公開) を使えば出来るかも知れん。
Catalyst は、元々 Simon Cozens が作った Maypole から派生した MVC フレームワークだと記憶していますけど、Maypole が出た時は「Sledge に良く似てるなー」って印象でした。Catalyst 自体はそこから更にスマートにして制約を落とす方向に、Maypole は制約を上げてお手軽実装出来るように進化したかも知れないです。
制約の度合を表現すると
ガチガチ Rails > Maypole > Sledge > Catalyst 柔軟
こんな感じでしょうか。
制約がキツくなく、でもある程度決まりきった処理をサクっと実装するには、Catalyst より Sledge のほうが上な気がしますが、Catalyst には Helper が充実しているから、とっつきやすいのかも知れませんが、そう言や Six Apart のせきむらさんが、Sledge Helper を作られてたなぁーとか思いました。
httpd も入ってます。
ちなみに、Sledge の場合
Sledge::Install::Stub
を自分用にゴッソリ編集してしまえば、ナニ用のスケルトンだなんだってホゲホゲやるよりプロジェクト全部のスケルトンを一気に作ってしまったりも出来ますから、別に Helper とか言われてもピンと来なかったです。ちなみに普段は
sledge-setup
によって吐かれるデフォルトのスケルトンを使ったりはまずしないです。んで、何が言いたいんかと言えば、Catalyst いいなーとか言っている人に対し、今まで Sledge のドキュメントってまともなのが無かったので、ちょっと書いてみるかぁって意気込みを見せてみようかと思いました。
「Sledge とか存在は知っているけど、ドキュメントが無いから Sledge 使ったこと、使おうと思ったことがない」って人多いんでしょうねぇ。
まぁぶっちゃけ、Prototype とかと一緒で「ソース嫁」が基本スタンスなんですけどね。
ってことで、Shibuya.pm から発生した、にわか Catalyst マンセームードに反抗すべく、Sledge ドキュメントを書いてみるであります。
Update:
そう言えば、以前 ThinkIT というサイトで、Sledge をベースにした Web アプリケーションフレームワーク特集がありましたので、そもそもフレームワークが何たるかとか、Sledge とは何たるかとかの前提知識がない方は、下記を読まれると良いかも知れません。
■ Sledge のインストール
これは clouder 氏の「Clouder::Blogger: Sledgeのインストールと設定方法」あたりを読んでください。ここに詳しく書かれた内容だけで全てが完結するはずです。
ちなみに、Sledge は UNIX な環境向けに作られていて、Windows な環境では、
PREREQ_PM
とかのせいで入れるのはかなり骨が折れます。PREREQ_PM
の一部は Active Perl の ppm リポジトリから、そこにも無いものは Randy Kobes の ppm リポジトリから、それでも無いのは、Microsoft Visual C++ Toolkit と Platform SDK を使用して build する必要があります。ちなみに Active Perl 自体が VC++ でビルドされているので、Borland C++ Compiler とかでは殆んどダメだったりします。
そこまで頑張れば「Windows でも Sledge が動く」ことが実感出来ると思います。
現に私の持っていた Windows XP のノートで Apache (Win32) + mod_perl + Active Perl という構成の上に Sledge で組んだテストアプリケーションが動いてました。
今ではもう面倒クサイのでやらないですし、普通に Mac OS X 上で動かして遊んでいたりしますが。
また、Sledge を mod_perl 環境下で動かす場合は、Apache/1.3.x 上での利用を前提としています。Apache/2.x + mod_perl 2.x での利用に対しては動作保証しません。
…てか、動きません。
■ Sledge の構造
Sledge を使った web アプリケーションでは、基本的にSledge::Pages::Base
を継承した Controller 経由で行ないます。その
Sledge::Pages::Base
のインスタンスから、基本コンポーネントの全に対しアクセサ経由で利用することが出来ます。そして、下記が Sledge の基本コンポーネントとなります。
Sledge::Pages::Base
Sledge::Request
Sledge::Request::Upload
Sledge::Template
Sledge::Session
Sledge::Config
Sledge::Charset
Sledge::SessionManager
Sledge::Authorizer
Sledge::FillInForm
MyProject
というプロジェクト (package) 名で開発を行なうことを前提とさせていただきます。■ Sledge::Pages::Base
Sledge::Pages::Base
は、Sledge の Controller 部で、通常、Sledge::Pages::Base
を継承したクラス内から、web アプリケーションの挙動を制御します。Sledge::Pages::Base
が、言わば「web アプリケーションがリクエストを受け、内部処理を実行し、適切にレスポンスを返す」という基本的な処理を行う、Sledge の根幹部分です。以後、この部分を「page クラス」と呼びます。
■ Sledge::Request
page クラスから、r()
アクセサ経由で利用します。Sledge を利用した web アプリケーションにおける、HTTP リクエスト処理部分を抽象化しています。
MyProject::Pages
から、use
される Sledge::Pages::Compat
は、環境変数 $MOD_PERL
の値に応じ、Sledge::Pages::Apache
もしくは Sledge::Pages::CGI
のどちらかを @ISA
配列につっこみます。これによって、mod_perl 環境か、mod_cgi 環境かに応じて、適切なリクエスト処理を行なうクラスを選択し、
r()
アクセサに (create_request()
ミュテイタ経由で) セットします。
それぞれは、Apache::Request
、Sledge::Request::CGI
のインスタンスをリクエスト処理のクラスとしセットします。Apache::Request
によって呼び出せるメソッドで、Sledge::Pages::Base
から呼び出されるものは Sledge::Request::CGI
によって、CGI.pm を利用してエミュレートされていますが、Sledge::Request::CGI
から利用出来ない、Apache::Request
のメソッドも多数あり、mod_perl 環境のほうがアプリケーションに多くの柔軟性を提供してくれます。なお、
Sledge::Request
オブジェクトは、テンプレート内で "r" という変数でセットされるため、[% r.param('foo') | html %]
のようにしてリクエストを画面に展開させることが容易にできます。
param($key[, $value])
以下、前提として、Sledge::Pages::Base
を継承した、MyProject::Pages::*
以下の Controller から利用しているため、ここでの $self
は、dispatch_foo()
メソッド内で受けた page クラスのインスタンスと解釈してください。
my @names = $self->r->param();
取得したリクエストパラメータの name を配列で返します。
my $username = $self->r->param('username');
引数一つを渡すと、その渡した name に属する value が返されます。
my @values = $self->r->param('foo');
セレクトマルチプルや、チェックボックス等、値が複数セットされる可能性のあるパラメータは、配列で受け取れます。
なお、スカラコンテキストの場合、一番最初の値のみが返されます。
$self->r->param(foo => 'bar');
引数 2 つの場合、値をセット出来ます。
$self->r->param(foo => ['bar', 'baz']);
引数 2 つで value に arrayref を渡せば、複数の値がセット出来ます。
upload($name)
my $upload = $self->r->upload('icon');
上記の場合、<input type="file" name="icon"> から送信されたファイルを操作する Sledge::Request::Upload
オブジェクトを取得します。
■ Sledge::Request::Upload
Sledge::Request::Upload
は、Sledge::Request
のインスタンスから upload()
アクセサ経由で利用出来ます。
また、Sledge::Request::Upload
から req()
アクセサ経由で Sledge::Request
のインスタンスを操作する事も出来ます。
link($filename)
$upload->link('/path/to/filename');
送信されたファイルを保存します。
なお、保存先が別パーティションの場合、失敗しますので、こちらから Sledge::Plugin::SaveUpload
を入手、インストールし、下記のようにする必要があります。
use Sledge::Plugin::SaveUpload;
my $upload = $self->r->upload('icon');
$upload->save('/path/to/filename');
これにより、link()
が失敗した場合に File::Copy::copy()
が呼ばれます。
<$upload>
while (my $data = <$upload>) {
# ...
}
Sledge::Request::Upload
オブジェクトは、ファイルハンドルとして扱うことが出来ます。
filename()
my $original_filename = $upload->filename();
元のファイル名を取得出来ます。
size()
my $size = $upload->size();
ファイルサイズを返す。
info()
my $info = $upload->info();
アップロード時の、対象ファイルのパートヘッダを格納した hashref を返します。
my $disposition = $upload->info('Content-Disposition');
引数付きで呼ぶと、そのパートヘッダの値を返します。
type()
my $content_type = $upload->type();
パートヘッダから、Content-Type 行 (MIME type) を返します。
next()
while (my $upload = $uploads->next) {
# ...
}
同じ name 属性でアップロードされたファイルの次の upload オブジェクトを取得します。取得するオブジェクトがない場合は、undef を返します。
tempname()
my $file = $upload->tempname();
テンポラリファイルの名前を返します。
header_out($field[, $value])
$self->r->header_out(Foo => 'bar');
任意に出力するヘッダのフィールド名と値をセットします。
上記の場合は
Foo: bar
というヘッダがレスポンスに付加されます。
my $value = $self->r->header_out('Foo');
出力ヘッダ Foo
の値を取得します。
headers_out($field[, $value])
my %headers = $self->r->headers_out();
出力するヘッダのフィールド名 => 値のハッシュを取得します。
my $headers = $self->r->headers_out();
スカラコンテキストでは出力するヘッダのフィールド名 => 値が入ったハッシュリファレンスが bless されたオブジェクトを返します。
header_in($field)
my $ua = $self->header_in('User-Agent');
リクエストヘッダ内の値を取得します。
content_type($type)
Content-Type
ヘッダの値を意図的に変更する場合に呼び出します。dispatch()
内から自動的に呼び出される output_content()
の呼び出しによって、この設定値は上書きされるため、変更した場合は $self->send_http_header()
等を呼び出し、$self->finished(1)
しておく必要があります。
method()
my $method = $self->r->method();
リクエストメソッドを返します。
status($status)
$self->r>status(403);
HTTP 応答ステータスを "200 OK"
以外に設定する場合に利用します。
print($content)
$self->r->print('Hello World!');
コンテンツを出力します。
uri()
my $uri = $self->r->uri();
REQUEST_URI
から QUERY_STRING
を取った URI を返します。
args()
my $qs = $self->r->args();
QUERY_STRING
を返します。
send_http_header()
$self->r->send_http_header();
HTTP 応答ヘッダを出力し、最後に空行を出力します。dispatch()
内から自動的に呼び出される output_content()
でこれは実行されるため、このメソッドを実行した場合は明示的に $self->finished(1)
を呼び出す必要があります。
■ Sledge::Template
page クラスから、tmpl()
アクセサ経由で利用します。
通常は、Template-Toolkit の wrapper クラスである Sledge::Template::TT
のオブジェクトが呼び出されますが、テンプレートエンジンに HTML::Template を使用したい場合は、MyProject::Pages
クラスで Sledge::Template
クラスを利用するように指定する必要があります。
なお、自動的に利用されるテンプレートのファイル名は、$self->tmpl_dirname()
+ dispatch()
メソッドへの引数 + ".html"
というファイル名が、$self->create_config->tmpl_path
のパスを起点とし、利用されます。
param($key[, $value])
my $value = $self->tmpl->param('foo');
引数 1 つでテンプレートにセットされたテンプレート変数の値を取り出します。
$self->tmpl->param(
phone => $phone,
email => $mail,
);
引数 2 個以上 (ハッシュ) で、テンプレート変数をセットします。
余談ですが、Sledge の多くのコンポーネントで param()
というメソッドが利用出来、どれも同じような挙動をしますが、複数の値を同時にセット出来るのは、Sledge::Template(::TT)
ぐらいだったりします。
set_option($key, $value)
$self->tmpl->set_option(INCLUDE_PATH => '/path/to/include');
テンプレートエンジンのコンストラクタに渡すオプションを設定します。
add_option($key, $value)
$self->tmpl->add_option(INCLUDE_PATH => '/path/to/include2');
テンプレートエンジンのコンストラクタに渡すオプションに追加の値を設定します。
output()
my $output = $self->tmpl->output();
テンプレートエンンジンによって処理された結果を文字列で返します。ここで返されるのは、fillin_form()
や charset()
および add_filter()
による出力フィルタリングを行なっていない段階のものなので、実際に出力されるコンテンツとは異なる可能性があります。
■ Sledge::Session
page クラスから、session()
アクセサ経由で利用します。
セッションで利用されるデータを保存するストレージには、MySQL、PostgreSQL、SQLite、File が標準で使用出来、DBM、memcached を利用するための Sledge::Session
クラスも sourceforge 内の CVS リポジトリから入手することが出来ます。
何を使用するかは MyProject::Pages
の中で指定することが可能で、デフォルトは MySQL が使用されます。
なお、Sledge::Session
オブジェクトは、テンプレート内で "session" という変数でセットされるため、[% session.param('foo') | html %]
のようにしてセッションの中身を画面に展開させることが容易にできます。
param($key[, $value])
$self->session->param(name => $name);
session に対して値をセットします。
my $name = $self->session->param('name');
セットされた値を取り出します。
ただ、実際にこのような方法では、name
が沢山作られ、複雑になる可能性が高いので、hashref 等に入れて session に入れる場合が殆どです。
remove($key)
$self->session->remove('name');
指定されたキーにセットされている値を削除します。
expire()
$self->session->expire();
全ての session を破棄します。
session_id()
my $sid = $self->session->session_id();
発行された session_id
を取得します。
is_fresh()
if ($self->session->is_fresh()) {
# do something ...
}
今回のアクセスによって、セッションが新たに生成されたか否かを判定します。
cleanup($page, $min)
$self->session->cleanup($self, 1440);
指定された時間 (分) 経ったセッションをストレージから破棄します。
■ Sledge::Config
page クラスから、create_config()
アクセサ経由で利用します。
Sledge::Config
は、MyProject::Config::_common
内の %C
というハッシュを読みます。
次に SLEDGE_CONFIG_NAME
という環境変数を調べ、定義されていなければ、/etc/MyProject-conf.pl
というファイルを実行します。必要であればこの中で SLEDGE_CONFIG_NAME
環境変数を設定し、実行環境に応じて異なる設定値を読ませてアプリケーションの挙動を変えたりします。
(e.g. テスト環境では $ENV{SLEDGE_CONFIG_NAME} = '_test';
にし、本番では $ENV{SLEDGE_CONFIG_NAME} = '_production';
のように設定。これによって同じアプリケーションでも path や datasource を環境別に分けることが容易)
次に改めて SLEDGE_CONFIG_NAME
環境変数が設定されていれば "MyProject::Config::$ENV{SLEDGE_CONFIG_NAME}"
を読み込みます。
つまり "MyProject::Config::$ENV{SLEDGE_CONFIG_NAME}"
によって MyProject::Config::_common
における設定値を上書けます。
なお、Sledge::Config
オブジェクトは、テンプレート内で "config" という変数でセットされるため、[% config.param('foo') | html %]
や [% config.foo | html %]
のようにして設定値の中身を画面に展開させることが容易にできます。
create_config()
my $conf = $self->create_config();
MyProject::Config
のインスタンスを返します。
case_sensitive()
メソッドが true を返さない限りは、%C
というハッシュのキーに対して大文字、小文字を問わずにメソッド経由でアクセスします。
my $tmpl_path = $self->create_config->tmpl_path;
my $tmpl_path = $self->create_config->TMPL_PATH;
また、Config
側で、
$C{FOO} = ['bar', 'baz'];
$C{FOO0} = { bar => baz };
のように arrayref や hashref で値が定義されている場合、コンテキストによってはデリファレンスされた値が返ります。
なお、これらの値は基本的には上書き不可ですが、can_modify_param()
が true を返す場合は上書きが可能となります。
param($key[, $value])
my $tmpl_path = $self->create_config->param('tmpl_path');
上記の場合は、$C{TMPL_PATH} の値を返します。
$self->create_config->param(
DATASOURCE => [ 'dbi:SQLite:/etc/sledge.db', '', '' ],
);
can_modify_param()
が true の場合、このように値が設定出来ます。
set($key => $value)
$self->create_config->set(cookie_name => 'hoge');
can_modify_param()
が true の場合、値が設定出来ます。
get($key)
my $domain = $self->create_config->get('cookie_domain');
指定したキーの設定値が取得出来ます。
MyProject::Config->instance()
use MyProject::Config;
my $conf = MyProject::Config->instance;
Sledge::Config
は Class::Singleton を継承しているので、このような方法でインスタンスを利用することも可能です。
■ Sledge::Charset
page クラスから、charset()
アクセサ経由で利用します。
Content-Type
ヘッダ値の設定や、入出力データのフィルタ (convert) を行うもので、基本的に直接操作することはありません。
デフォルトは Sledge::Charset::Default
が使用され、EUC-JP で開発されることを前提としています。
■ Sledge::SessionManager
page クラスから、manager()
アクセサ経由で利用します。
セッション情報の操作を行うためのユニークキーを、Cookie から取得、設定を行うためのクラスで、こちらも直接的に使用することは殆んどありません。
■ Sledge::Authorizer
page クラスから、authorizer()
アクセサ経由で利用します。
認証関連に使用出来るクラスで、デフォルトは、Sledge::Authorizer::Null
を使用しています。
これはその名の通り、何もしておらず、通常はこれをスケルトンとして、独自の認証機構を組込みます。
■ Sledge::FillInForm
page クラスから、fillin_form()
アクセサ経由で利用します。
Sledge では、$self->r->method
が POST
の場合、HTML に対して自動的に各フォームの要素を埋めるために、HTML::FillInForm を wrap した Sledge::FillInForm
の fillin()
メソッドが実行されます。
なお、通常は、POST method の場合のみ、fillin_form()
アクセサから Sledge::FillInForm
オブジェクトが返され、POST じゃない場合は明示的に load_fillin_form()
を呼び出すことによって、fillin_form()
経由で呼べるようにセットしなくてはならない。
ignore_fields($field1[, $field2, $field3, ...])
$self->fillin_form->ignore_fields(@fields);
$self->fillin_form->ignore_fields(\@fields);
引数は配列でも arrayref でも可。fillin させたくないフォーム要素の name 属性を入れます。
fobject($object)
$self->fillin_form->fobject($self->session);
param()
メソッドを持つオブジェクトを渡すことによって、その内部で、param()
メソッドを呼び値を fillin する。
add_fobject($object)
$self->fillin_form->add_fobject($self->create_config);
param()
メソッドを持つオブジェクトを渡すことによって、fillin する対象を追加出来る。
target($name)
$self->fillin_form->target('login_form');
fillin する対象のフォームを <form name="login_form"> 〜 </form> 内に限定する。
fdat(\%data)
$self->fillin_form->fdat(\%data);
%data
というハッシュの値を fillin する。
$Sledge::FillInForm::FillPassword
local $Sledge::FillInForm::FillPassword = 0;
<input type="password"> の要素を fillin させるかどうかを設定出来る。デフォルトは 1 (する) になっている。
■ 非アクセサ
以下、Sledge::Pages::Base
内部の、非アクセサ系 API です。
load_template($filename)
ページと異るファイル名のテンプレートを利用する場合に利用します。
redirect($url[, $scheme])
$self->redirect('http://www.example.com/');
HTTP 302 でリダイレクトを行います。
$self->redirect('./next');
相対 URL でも、絶対 URL に変換して Location
ヘッダを送出します。
$self->redirect('/payment/input', 'https');
スキーム名を与えることで、スキーム変更しながらリダイレクトも行えます。
注意点として、redirect()
メソッドを呼び出した時点では、リダイレクトが行なわれるわけではありません。
dispatch_*
を抜けるまでは処理が続くため、redirect()
実行時以降に書かれた処理を実行させることも可能です。
また、redirect()
実行後は AFTER_DISPATCH
トリガは実行されません。
finished($bool)
$self->finished(1);
dispatch_*
内の処理を終了させる場合、明示的に呼び出します。
ただし、output_content()
等がこの値が true の時に呼び出されないため、何もコンテンツが出力されないという問題が発生する可能性がありますので、明示的に output_content()
を実行する等が必要です。
output_content()
$self->output_content();
HTTP ヘッダやコンテンツの出力を行う場合に利用します。
通常は、開発する側が何もしなくても、dispatch_*
の実行後に自動的に呼び出されます。
current_url()
my $url = $self->current_url();
現在の URL を返します。
register_hook($hook => $code);
__PACKAGE__->register_hook(
BEFORE_DISPATCH => sub {
my $self = shift;
my $now = localtime();
$self->tmpl->param(now => $now);
},
);
この場合 dispatch_*
が実行される前にテンプレート変数 now
が定義されます。
定義可能なトリガポイントは、
AFTER_INIT
BEFORE_DISPATCH
AFTER_DISPATCH
AFTER_OUTPUT
の 4 つで、CVS にある最新版では、BEFORE_INIT トリガも存在します。
add_trigger($code)
$self->add_filter( sub {
my($self, $content) = @_;
$content =~ s/UNIX/Linux/ig;
return $content;
});
出力するコンテンツ全体にフィルタするメソッドを追加します。複数追加可能です。
tmpl_dirname($dir)
__PACKAGE__->tmpl_dirname('shop/cart');
Config
で設定された TMPL_PATH
からの相対パスで、利用するテンプレートのディレクトリを指定します。
set_content_length($length)
$self->set_content_length(12345);
Content-Length
ヘッダ値を設定します。output_content()
が実行されると、この値は正しい値に上書きされます。
is_post_request()
my $is_post = $self->is_post_request;
$self->r->method()
が "POST" であった場合に true を返します。
make_content()
my $content = $self->make_content();
テンプレートを展開して出力するコンテンツを返します。output_content()
はこれを自動的に実行します。
make_absolute_url($url[, $scheme]);
my $abs_url =
$self->make_absolute_url('../../foo', 'https');
現在の URL に基づいた絶対 URL を作ります。redirect()
の内部で利用されています。
page()
my $page = $self->page();
dispatch()
メソッドに渡された、現在のページ名を取得出来ます。
load_fillin_form()
$self->load_fillin_form();
REQUEST_METHOD
にかかわらず、fillin させたい場合に実行し、fillin_form()
アクセサに Sledge::FillInForm
をセットさせます。
Sledge のメソッド解説は以上です。
他にもここで紹介していないメソッドが存在しますが、ここに記載されている内容だけで、普通のアプリケーションを開発するには十分です。
では、ここから、実際に Sledge を使って、簡単なブックマークアプリケーションを作ってみましょう。
■ 10 分で作る Sledge アプリケーション
実践編はこちらです。
開発手順の参考になさってください。