ほとんどPODに書いてあるような内容です。ほぼ備忘録です。
ルートパスのワイルドカードマッチ
ルートパスにはワイルドカード'*'を含むことができます。それぞれのワイルドカードに一致した内容はsplatを通して取得することができます。
下記の例の場合、最初のワイルドカードはアクション、2番目のワイルドカードは何かのIDを表します。
get '/wildcard/*/*' => sub { my ($action, $id) = splat; if ($action eq 'view') { # 閲覧ページの表示 } elsif ($action eq 'delete') { # 削除ページの表示 } else { status 'not_found'; return 'What?' } };
ルートパスの正規表現マッチ
Perl正規表現を利用してルートパスを宣言することもできます。こちらも同様にsplatを通して値を取得できます。
get r('/reg/([\w]+)') => sub { my ($name) = splat; return $name . ' matches ([\w]+)'; };
beforeフィルター
beforeフィルターを使うことにより、リクエストやレスポンスを処理する前に書き換えることができます。
下記の例の場合、どのルートパスにアクセスしてもリクエストパスが/foo/oversee書き換えられてしまうというどうしようもない結果になります。
before sub { var note => 'Hi there.'; request->path('/foo/oversee'); }; get '/foo/*' => sub { my ($match) = splat; vars->{note} . ' Here is ' . $match; };
auto_page
シンプルなページで特に動的な処理が必要ないページでもヘッダやフッタを共通なものを使いたい場合にはauto_page機能が使用できます。
auto_page機能が有効の時に、リクエストパスがどのルートハンドラーにも一致しなかった場合、viewsディレクトリを確認しに行きます。もし一致するテンプレートが存在した場合、その内容を返します。
例えば、/foo/barというリクエストの場合、/views/foo/bar.ttの内容を返します。
下記のように設定ファイルに記述するとauto_page機能が有効になります。
auto_page: 1
セッション
下記の内容を設定ファイルに記述するとセッション(Dancer::Session::Simple)が有効になります。
session: Simple
ただし Dancer::Session::Simpleはメモリにセッションデータを保存するためにアプリケーションを再起動した際、消えてしまいます。それを回避するためにDancer::Session::YAMLが使えます。これは、/sessionディレクトリ以下にYAMLファイルとしてセッションデータを保存するため、アプリケーション再起動時にも消えることがありません。
Dancer::Session::YAMLを有効にするには以下のように設定ファイルに追記します。
session: YAML
セッションデータの保存
コード内で下記の記述をするとセッションデータを保存できます。
session data => 'data';
セッションデータの読み込み
コード内で下記の記述をするとセッションデータを取得することができます。
session('data');
もしくは下記のようにも書けます。
session->{data};
下記の例は、セッションデータを挿入し、そのデータを表示する簡単なサンプルコードです。
get '/insert/session/*' => sub { my ($data) = splat; session data => $data; return 'insert session data! : ' . $data; }; get '/view/session' => sub { if (not defined session('data')) { return 'not exists session data!'; } else { return 'session data is ' . session('data'); } };
セッションデータの保存先の変更
セッションデータはデフォルトでは/sessions/'セッションID'.ymlに保存されます。
保存先ディレクトリを変更するには下記のように設定ファイルに追記します。
session_dir: /path/to/session_data
続く? 力尽きたので設定ファイルに関しては次回書きます。
参考
- 過去の記事