読者です 読者をやめる 読者になる 読者になる

k-holyのPHPとか諸々メモ

Webで働くk-holyがPHP(スクリプト言語)とか諸々のことをメモしていきます。ソースコードはだいたいWindowsで動かしてます。

Silex + OptionsResolver で FizzBuzz パラメータ編

PHP Silex

Silex + OptionsResolver で FizzBuzz の続きです。

前回のサンプルだとSilex使っている意味がないので、パスで指定された値を使ってFizzBuzzを実行するよう、エントリスクリプトを書き換えました。

"/{var}/{type}" という2つのパラメータを含んだパスへのGETリクエストのハンドラを設定しています。

1つ目のパラメータは「1-100」というようにFizzBuzzの範囲をハイフン区切りで指定でき、2つ目のパラメータでは戻り値のフォーマット(html or json)を指定します。
Silex\Route::value()メソッドによって、1つ目のパラメータは "1-100" 2つ目のパラメータは "html" を初期値に指定し、パラメータ指定のないパス "/" へのリクエストもこのハンドラで処理させています。
ハンドラの戻り値は文字列ではなく、Symfony\Component\HttpFoundation\Response を生成するよう変更しましたが、2つ目のパラメータに "json" が指定された場合は、レスポンスをJSONで返すようにしています。

OptionsResolverを使ってFizzBuzzの処理を行う部分は、中身は前回と同じですが、Silex\Application (というかPimple) のprotect()メソッドでApplicationに登録してみました。

簡単ではありますが、これでSilexの基本的な使い方のおさらいになったかと思います。

[追記 2012/11/09]
元記事 OptionsResolver を使って FizzBuzz 問題に取り組む - Sarabande.jp を書かれた id:masakielastic2 さんのコメントを受けまして、コードを更新しました。
Response::create()を new Response()に置き換え、JSONレスポンスはApplication->json()で返すようにしました。
併せて、入力値のチェックをFizzBuzz処理に移しています。
今回のような規模のコードではあまり利点はありませんが、ビジネスロジックを複数のハンドラで共用するケースだと、Web特有の処理をSilexとリクエストハンドラに集中して、それ以外は外に出す形が良いんじゃないかと思います。
あとはApplication->assert()も併用するとより良いでしょうか。
(このメソッドもまだ機能を把握できてないので、いずれ確認しないといけないんですが…)