ダウンロード サンプルファイル (51.0 KB)
プライベート(: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 | 指定したページを削除 |
この記事は参考になりましたか?
- Webアプリケーションフレームワーク「Catalyst」入門連載記事一覧
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 花田 善仁(ハナダ ヨシヒト)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア

