プライベート(:Private)
アプリケーションを実装していくと、共通の処理をまとめて定義し、それをいろいろなところから呼び出したくなる場合があります。このようなアクションを定義するには「:Private
」アトリビュートを使用します。このプライベートアクションは、URLに結びつけられることはなく、他のアクションから呼び出された場合のみ実行されます。
プライベートアクションに処理を受け渡すには、「$c->forward
」や「$c->detach
」を使用します。アクションからプライベートなど、他のアクションを呼び出す方法については、今後説明する予定です。
引数の制限(:Args)
「:Args
」アトリビュートは、他のアトリビュートとは異なり、単独で指定した場合にアクションとはなりません。:Args
は他のアトリビュートと組み合わせることで、パスを引数として扱う場合の制限を定義するために使用します。:Args
アトリビュートを設定しない例を見てみましょう。この例では「Root.pm」に「no_args
」アクションを定義します。
package HelloC::Controller::Root; # 省略 sub no_args :Local { my ( $self, $c ) = @_; my $msg; # (1)引数を配列から取得 foreach my $arg (@{$c->req->args}) { $msg .= " $arg "; } # (2)引数を表示 $c->response->body( "Args: [$msg]" ); }
no_args
アクションでは次のような処理を定義しています。
(1)引数を配列から取得
アクションで指定したパスにマッチした場合、マッチしたパス以降の文字列は、スラッシュで区切られ、Catalyst::Requestのarguments
、またはargs
に配列の参照として格納されます。ここでは、/no_args
以降のパスをforeach
で取得して、$msg
変数に追加しています。
(2)引数を表示
$msg
変数に追加した引数を表示しています。次のURLをWebブラウザで表示させた場合にどのように表示されるでしょうか。
http://<ホスト名またはIPアドレス><:Port>/
no_args/aaa/bbb/ccc
エラーになることもなく、「aaa bbb ccc
」が引数として扱われています。マッチするパス以降の文字列を引数として扱いたいが、特定の個数だけを受け入れたい場合、例えば引数を1つだけ受け入れたいが、0個や2個以上指定された場合にはエラーとしたい場合などに:Args
を使用します。
次に、1つだけの引数を受け入れる場合のアクションは次のようになります。この例では「Root.pm」に「restrict_args
」アクションを定義します。
package HelloC::Controller::Root; # 省略 # (1)引数を1つだけに制限 sub restrict_args :Local :Args(1) { my ( $self, $c ) = @_; # (2)引数を表示 $c->response->body( $c->req->args->[0] ); }
restrict_args
アクションでは次のような処理を定義しています。
(1)引数を1つだけに制限
「:Args(1)
」で、受け入れる引数の個数を1個として指定します。2つの引数を受け入れる場合には「:Args(2)
」のように指定します。
(2)引数を表示
「$c->req->args->[0]
」で最初の引数を取得し、レスポンスとして表示します。
ここで、
http://<ホスト名またはIPアドレス><:Port>/
restrict_args/aaa
というURLを表示させた場合には「aaa」が表示されますが、
http://<ホスト名またはIPアドレス><:Port>/
restrict_args
や
http://<ホスト名またはIPアドレス><:Port>/
restrict_args/aaa/bbb
を指定した場合には、「Page not found」が表示されます。また、マッチしたパス以降に1つも引数を取りたくない場合には、「:Args(0)
」と指定します。
アクションの連鎖(:Chained)
Webアプリケーションの機能が増えてくると、対応させるアクションも増えてきます。例えば次のようなWikiアプリケーションを実装する場合に、正規表現アクションであればURLごとにアクションを定義することになりますが、「:Chained
」アトリビュートを使用すると、パスの階層ごとにアクションを定義し、それらを連鎖させることができるようになります。:Chained
アトリビュートの使い方については、次回以降でもう少し詳しく説明します。
パス | 説明 |
/wiki | 「FrontPage」を表示 |
/wiki<ページ名> | 指定したページを表示 |
/wiki<ページ名>/new | 指定したページを作成 |
/wiki<ページ名>/edit | 指定したページを編集 |
/wiki<ページ名>/delete | 指定したページを削除 |