menu
書いてる野郎
orebike@gmail.com
どんなURLでアクセスしてきたらどのコントローラーに渡すかという話し
failed to fetch data: unkown error
どんな URL をどのコントローラーのメソッドにマッピングするかは config/routes
というファイルで設定する。
決まったURLを決まったコントローラへ
GET /hello/world controllers.Hello.world
このように設定すると GET メソッドで http://example.com/hello/world というURLでアクセスしてきた場合(ドメインはそれぞれ)、 Hello コントローラークラスの world メソッドを呼び出すことになる。
このように、
メソッド名 URL コントローラー
のように並べて書くのが routes 設定の書き方の基本になる
REST的なURL(パラメータがスラッシュ区切りで並ぶ)にしようとした場合にどうするかという話
GET /hello/:name controllers.Hello.greet(name:String)
このように、URL の部分の一部をコロンから始まるものにし、その名前でコントローラーのメソッドを呼び出すように記述する
受ける側のコントローラーは
object Hello extends Controller { def greet(name:String) = Action { Ok("hello " + name) } }
のようにして受け取る。
パラメータの一部にラベルが付いているようなパターン
つまり、
http://example.com/hello/namehogehoge
のように渡したいパラメータ(hogehoge)にnameというラベルが付属している場合
GET /hello/name:name controllers.Hello.greet(name:String)
このように何事もないようにラベルをくっつければよい
定義が被ってしまう場合はより上に書いたほうが採用される。つまり条件がキツイ順番に書けということだ
ではラベルが後ろに合った場合はどうなる?このように設定したい
GET /hello/:namename controllers.Hello.greet(name:String)
これはエラーになるので出来ないということだ。
パラメータの形式を正規表現で使える版。
コロンではなくドル記号で指定し、<>
の中に正規表現を書く。
コレを使うと
GET /hello/$name<[^/]+>name controllers.Hello.greet(name:String)
コロンバージョンでできなかった後ろラベルとかにも対応できる。
注意すべき点、勘違いしない点としてパターン全体を正規表現で書く(うまく書いて設定自体の記述量を減らす)こととはできないということ。 正規表現はパラメータとして取りたい値がどのような形状の値をとるかということを表現する
外部からパラメータを取るオーソドックスなパターン。この場合は
GET /hello/greet controllers.Hello.greet(name:String)
このように URLには何も書かずに、引数を取るコントローラーを呼び出す。 この時の呼び出す引数名を想定される QueryString のキーと一致させる
http://example.com/hello/greet?name=hogehoge
このようにして呼び出せる。
Playのデフォルトで routes ファイルに
GET /assets/*file controllers.Assets.at(path="/public", file)
このように記述されている。
これは
http://example.com/assets/a/b/c.jpg http://example.com/assets/d/e/f.js
のような記述した呼び出しが
/public/a/b/c.jpg /public/d/e/f.js
を呼び出すことを示している
つまり、controllers.Assets.at メソッドはファイルそのものをレスポンスするメソッドで、Play としては静的も動的も関係ないということになる。