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

k-holyのPHPとか諸々メモ

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

Silex + OptionsResolver で FizzBuzz

PHP Silex

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で何かを作る時は一緒に使ってみようかな。