Hatena::Groupangelos

Agile Web Development with Angelos

 | 

2009-01-20

HTTP::RouterによるAngelosのrouting #1

11:45 | HTTP::RouterによるAngelosのrouting #1 - Agile Web Development with Angelos を含むブックマーク はてなブックマーク - HTTP::RouterによるAngelosのrouting #1 - Agile Web Development with Angelos

Angelosでのルーティング


Angelosでは、開発ディレクトリ中の conf/routes.pl に

HTTP::Routerを使ったルーティング処理を書くことにより、

リクエストされたURLに対して動作するコントローラとアクションを決定します。


HTTP::Routerのdefine


HTTP::Routerでの定義の仕方はdannさんが書かれていますので

まずはそちらを参照するとよいと思います。

http://dann.g.hatena.ne.jp/dann/20090105/p1


上の記事で雰囲気はつかめると思いますが、

Controller側の説明が無かったので例を挙げておきます。


routes.plの例

HTTP::Router->define(sub{
  $_->match('/')->to({ controller => 'Root', action => 'index' });
});

上記のようにroutes.plが定義されたとき

アプリケーションルートへのアクセスがあった場合

MyApp::Web::Controller::Rootのindexメソッドが呼ばれます。


コントローラクラスの例

package MyApp::Web::Controller::Root;
use Angelos::Class;
with 'Angelos::Controller';

sub index {
  my ($self, $c, $params) = @_;
  ...
}
__END_OF_CLASS__;

このようなコントローラクラスを用意する必要がありますが、

ジェネレータを使って雛形を用意することが可能です。

ジェネレータについては別途説明します。


Angelos::ClassやAngelos::Controller, __END_OF_CLASS__などが

出現していますが、今回はルーティングの説明なので、

それらに関する説明も省略します。

これらについては

http://angelos.g.hatena.ne.jp/lyokato/20090120/1232429809

を参照して下さい。


アプリケーションURLのルートにアクセスがあったら

上のindexメソッドが呼ばれるということだけ覚えておいて下さい。

ここでは、もう少しHTTP::Routerについて補足したいと思います。


HTTP::Routerによる定義


matchとtoによる定義

今までの例を見てもらうと分かる通り、

基本的にはmatchとtoで、ディスパッチルールを定義します。

matchにURLを渡して、toで対応するコントローラとアクションを指定する

簡単な処理ですが、もう少し高度な処理も可能です。


match


matchに渡せるのは正確にはURI Templateです。

URI Templateに関しては次のURLを参照して下さい。

http://tools.ietf.org/html/draft-gregorio-uritemplate-03


routes.plの例

HTTP::Router->define(sub {
  $_->match('/book/{book_id}')->to({ controller => 'Book', action => 'show' });
});

このような定義がされたアプリケーションに対し、

http://example.com/book/111,

http://example.com/book/200

というようなパターンのアクセスがあった場合、

MyApp::Web::Controller::Bookのshowメソッドが実行されます


コントローラクラスの例

package MyApp::Web::Controller::Book;
use Angelos::Class;
with 'Angelos::Controller';

sub show {
  my ($self, $c, $params) = @_;
  my $book_id = $params->{book_id};
  ...
}
__END_OF_CLASS__;

テンプレートにマッチした値(上の例ではbook_id)は、

例のように、アクションに渡される第三引数ハッシュリファレンスである

$paramsが持っています。


条件の絞り込み

さらに上の例ではbook_idは正の整数でなければならないことが予想されます。

そのような条件を課したい場合は、次のように書けます。


HTTP::Router->define(sub {
  $_->match('/book/{book_id}', { book_id => qr/^¥d+$/ } )
    ->to({ controller => 'Book', action => 'show' });
});

このように、matchの第二引数には、URI Templateの

テンプレート値に条件を与えることが出来ます。

条件はハッシュリファレンスで記述します。


上の例ではbook_idというキーに対して、正規表現で条件を与えています。

正規表現以外にも, 配列リファレンスで条件を記述することが可能です。


HTTP::Router->define(sub {
  $_->match('/book/{book_id}', { book_id => [1, 2, 3, 4, 5] } )
    ->to({ controller => 'Book', action => 'show' });
});

実用的ではない強引な例ではありますが、

上の例ではbook_idは1,2,3,4,5のどれかしか受けつけません。



URI Template以外の条件を課す例

URL-Template のテンプレート値だけではなく

その他のHTTPリクエストの値にも条件を課すことが可能です。


HTTP::Router->define(sub {
  $_->match('/book/{book_id}', { method => ['GET'] } )
    ->to({ controller => 'Book', action => 'show' });
});

上は、リクエストメソッドがGETの場合のみを許可する例です。

内部では、リクエストを表現するオブジェクト

(Angelosの場合は、HTTP::Engine::Requestのオブジェクト)を使い

$req->methodの結果がGETかどうかをチェックしています。


このように、HTTP::Routerでは、URI-Templateと、

テンプレート値、その他のリクエスト条件を絞り込み、

対応するコントローラのアクションへディスパッチすることが可能です。


他にもRESTfulな設計を簡単に行うための機能や、

ネストを使った表現などがありますが、別の機会に説明したいと思います。

GythaGytha2011/10/13 15:07I really codlun't ask for more from this article.

scpstilgkllscpstilgkll2011/10/14 02:037H6Q13 <a href="http://ufmkjkkfhttb.com/">ufmkjkkfhttb</a>

badxkkvaxrbadxkkvaxr2011/10/14 18:29ZGU6dB , [url=http://ehoftivdabpt.com/]ehoftivdabpt[/url], [link=http://aaiegibiddse.com/]aaiegibiddse[/link], http://ladkpuwauhnw.com/

yikyflcbmyikyflcbm2011/10/17 01:261avtNS <a href="http://idlecaximebz.com/">idlecaximebz</a>

cohhmncohhmn2011/10/18 18:53vtaTyJ , [url=http://kiwlbqagaqvy.com/]kiwlbqagaqvy[/url], [link=http://fltutiywxata.com/]fltutiywxata[/link], http://pgujweujgxls.com/

JasonbiameJasonbiame2017/01/25 04:20визитки киев http://wkrolik.com.ua/products/firmennye-blanki

 |