@kyanny's blog

私は天才ではありません。ただ、人より長く一つの事と付き合っていただけです - アインシュタイン

Catalyst の Controller の Attribute について勉強した

Catalyst::Manual::Cookbook - Cooking with Catalyst - metacpan.org

:Path :Args(0) とか :Local とか、以前マニュアルを読んだけど忘れちゃったのでまた読んだ。

:Path は sub handler :Path('hoge') {} とかやると、 /hoge とかにアクセスしたときに呼ばれる。コントローラクラスにはやすメソッドを、実際外部からアクセスさせる URL のパスと違うものにできますよ、ということか。 Sledge でいうと Sledge::Dispatcher::Properties とかに相当するのかな。ヘルパーで作られる sub index :Path :Args(0) で引数なしなのはなんでそうなってるのかよくわからず。 index は default や end と同じで特殊なものらしいから深く考えないでおこう。

:Args は、 URL のパスが /hoge/arg1 とかいう構造に「必ずなる」ようにできる。 sub hoge :Args(1) {} だと /hoge にアクセスしたときは呼ばれず、 /hoge/arg1 とか /hoge/arg2 とかにアクセスしたときに呼ばれ、 arg1 や arg2 が引数として渡る、それに $c->arguments->[0] とかでアクセスできる?のかな?ブログの URL で /archives/helloworld は permalink だけど /archives にはアクセスできませんよ、みたいなのを実現できるということか。俺は /archives にアクセスしたら過去記事一覧が見えたほうが嬉しいけど。

:Local はメソッド名と URL のパスが一致した場合に呼ばれる、つまり多くの場合これが使われる。だからちまたのコードスニペットにも :Local なものが多いんだろう。 MyApp::Contorller::Hoge の sub moe :Local {} ならば /hoge/moe にアクセスしたときに呼ばれる。

あと :Private は $c->forward($action) した場合だけに呼ばれて、外部から直接叩けないものを作れる。

:Global, :Regexp は必要に迫られたらまた詳しく見よう。ざっと流してみただけでも概要はわかった。

:Chained がなんだかよくわからない。そしてこれがキモというか、これを使いこなしていくと記述量がぐっと減りそうな予感がする。けどこれも必要に迫られるか、慣れて余裕が出来てからまた詳しく勉強しよう。