Silex + OptionsResolver で FizzBuzz
Symfony2.1からOptionsResolverというコンポーネントが追加されましたが、連想配列によるオプション引数を扱うのに便利そうなので、こちらの記事を参考に試してみました。
OptionsResolver を使って FizzBuzz 問題に取り組む - Sarabande.jp
ついでに、長い間触っていなかったSilexも合わせて、PHP5.4のビルトインサーバでやってみます。
まずはcomposer.pharを取得
$ wget http://getcomposer.org/composer.phar
composer.jsonを作成します。
"minimum-stability": "dev" を指定しないと、以下のようなエラーに遭遇しますのでご注意を。
$ php composer.phar install Your requirements could not be resolved to an installable set of packages. Problem 1 - The requested package silex/silex could not be found in any version, there may be a typo in the package name. Potential causes: - A typo in the package name - The package is not available in a stable-enough version according to your minimum-stability setting see <https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion> for more details. Read <http://getcomposer.org/doc/articles/troubleshooting.md> for further common problems.
気を取り直してinstall
$ php composer.phar install Loading composer repositories with package information Installing dependencies - Installing symfony/routing (dev-master b4c39ea) Cloning b4c39ea080cfcce4efbfa90fc6cac4222c36432b - Installing symfony/http-foundation (dev-master 61c1551) Cloning 61c1551f4e429fda1609ed0c8aa5a194ace599ec - Installing symfony/event-dispatcher (dev-master 24a1039) Cloning 24a1039d52b6b9f533cb73dcb96c7748262db686 - Installing symfony/http-kernel (dev-master 4dcb0bf) Cloning 4dcb0bf602788342fb80c28c6e28be818839d417 - Installing pimple/pimple (dev-master b9f27b8) Cloning b9f27b8dc18c08f00627dec02359b46a24791dc3 - Installing silex/silex (dev-master 04feaff) Cloning 04feaff05e6cb0437f405e715adb720dccf8313a - Installing symfony/options-resolver (2.1.x-dev v2.1.3) Cloning v2.1.3 symfony/routing suggests installing doctrine/common (>=2.2,<2.4-dev) symfony/routing suggests installing symfony/config (2.2.*) symfony/routing suggests installing symfony/yaml (2.2.*) symfony/event-dispatcher suggests installing symfony/dependency-injection (2.2.*) symfony/http-kernel suggests installing symfony/browser-kit (2.2.*) symfony/http-kernel suggests installing symfony/class-loader (2.2.*) symfony/http-kernel suggests installing symfony/config (2.2.*) symfony/http-kernel suggests installing symfony/console (2.2.*) symfony/http-kernel suggests installing symfony/dependency-injection (2.2.*) symfony/http-kernel suggests installing symfony/finder (2.2.*) silex/silex suggests installing symfony/browser-kit (>=2.1,<2.3-dev) silex/silex suggests installing symfony/css-selector (>=2.1,<2.3-dev) silex/silex suggests installing symfony/dom-crawler (>=2.1,<2.3-dev) Writing lock file Generating autoload files
必要なものが入りました。
ビルトインサーバのルータースクリプトはこんな感じです。
ブラウザを起動していると favicon.ico へのアクセスがうるさいので、PHPマニュアルの記述を参考にしました。
PHP: ビルトインウェブサーバー - Manual
これで、ファイルが存在しないパスへのリクエストは、全てSilexのエントリスクリプトに処理させます。
エントリスクリプトのコードはこんな感じです。
OptionsResolverの使い方はほぼ参考元の記事のパクリなんですが、何をやってるか自分が分かりやすいように、連想配列に変えました。
range()で生成した1から100までの数値の配列を、array_map()でOptionsResolverに処理させています。
配列定義の短縮形はもちろん、メソッドの戻り値にそのまま配列アクセスしたり、PHP5.4の威力を実感できますね。
ちなみにFizzBuzz部分の処理は、以前書いたもの https://gist.github.com/1269136 の使い回しです。
このクラスは、setDefaults() メソッドによるデフォルト値の定義にクロージャを使うことで、動的に値を設定できるところが面白いです。
resolve() 実行時に、setDefaults()で定義しているクロージャの引数に Options が渡されるので、FizzBuzz処理を行う無名関数を実行して結果を返しています。
Options は ArrayAccess, Iterator, Countable を実装しており、配列と同じように扱えます。
このクラスはSymfonyフレームワークのフォーム処理のために作られたようで、Formコンポーネントのコードでふんだんに利用されています。
フレームワークとしてのSymfonyを使う機会はなかなかないのですが、同じSymfonyファミリーということで、Silexで何かを作る時は一緒に使ってみようかな。