これからのSilexのインストール方法

七夕ですね。BEAR.Sundayが楽しいですね。詳細についてはまだ発表されていませんが7/19(木)についに BEAR.Sunday Meetup #0 が開催されるようですよ。

今日はSilexのインストール方法について色々変更があったのでまとめておきます。

silex.pharは配布しないぜよ

詳しくはダウンロードページにまとめられていますが、これまで silex.phar の1ファイルをDLするだけ!が特徴だったのですが、これは今後配布されなくなります。

1ファイルだけで管理できるというのが大きかったのですが、それよりもデメリットのほうが大きいという判断だと思います。

たとえば、実行速度。pharファイルはアーカイブなので展開処理分オーバーヘッドです。以前試したところでは、Hello Worldを表示するレベルでもpharを使わなければ140%ぐらいのリクエスト処理数になりました。

あと、コア開発者側としては、pharを動かせずにissueやMLにいつも質問が飛び交っていてサポートするのが大変というのもあったかもしれません。

事実、pharに入っているSymfony Componentのバージョンが上がるだけでSilexのコアが変更されていなくてもsilex.pharも更新しなければならず面倒というのもあったと思います。
この問題はこれから説明するcomposerによるインストールでいっきに解決します。

とりあえず Silex のコードだけを入れる方法

composerはパッケージの依存関係を管理する方法です。最小構成のSilexをインストールするには以下のcomposer.jsonというファイルを用意します。

composer.json
{
    "require": {
        "silex/silex": "1.0.*"
    }
}

そして、composer.pharをダウンロードしてきて、installを叩くだけ。

$ curl -s http://getcomposer.org/installer | php
$ php composer.phar install

かんたんですよね。もし、twigも使うという場合は

{
    "require": {
        "silex/silex": "1.0.*",
        "twig/twig": ">=1.8.0,<2.0-dev"
    }
}

とtwig/twigの1行を追加し

$ php composer.phar update

を叩くだけ。これで最新のstable版が追加でインストールされます。
いままでのことを考えるとかなり便利だと思います。

本格的にSilexを使うためのたったひとつの方法

この記事を書いたのはこの方法について知って欲しかったからなのです。
Silexである程度大きなアプリを作るとなると、コントローラーを別ファイルにしたり、ロガー欲しいよねとか、いろいろあるわけですが、このあたりの準備となるディレクトリ構成などは自分で考えなくてはなりませんでした。もしくは、Silex-Kitchen-Editionという全部入りのコードをgithubからダウンロードしてくるというのが一般的でした。

大丈夫です。これからは良い感じのスケルトンが用意されました。
何も考えずに以下のコマンドを打てば作業は終わりです。

$ php composer.phar create-project fabpot/silex-skeleton ./silex
$ mkdir ./silex/silex.log ./silex/cache
$ chmod 0777 ./silex/silex.log ./silex/cache

これでコマンドを打ったディレクトリにsilexというディレクトリが作成され、そこにsilexのスケルトンファイルが用意されます。実際にはdoctrine/dbal以外はすべてインストールされます。
これだけでも便利ですよね。

あとはweb/index.phpがプロダクション環境用、web/index_dev.phpが開発用のコントローラになっているのはSymfony2っぽい感じですね。

また、コンソールから叩くための準備もされていて

$ php console

を叩くとmy-commandがサンプルとして用意されているのが見えます。

このスケルトンを利用すれば、最初の開発するまでの手順はかなり短縮化できると思います。
あとは composerがもう少し安定してくれれば...

おまけ

doctrine/dbalも使いたい場合は composer.json

{
    "name": "fabpot/silex-skeleton",
    "require": {
        "php": ">=5.3.3",
        "silex/silex": "1.0.*",
        "twig/twig": ">=1.8.0,<2.0-dev",
        "monolog/monolog": ">=1.0.0,<1.2-dev",
        "symfony/browser-kit": "2.1.*",
        "symfony/class-loader": "2.1.*",
        "symfony/config": "2.1.*",
        "symfony/console": "2.1.*",
        "symfony/css-selector": "2.1.*",
        "symfony/finder": "2.1.*",
        "symfony/form": "2.1.*",
        "symfony/monolog-bridge": "2.1.*",
        "symfony/process": "2.1.*",
        "symfony/security": "2.1.*",
        "symfony/translation": "2.1.*",
        "symfony/twig-bridge": "2.1.*",
        "symfony/validator": "2.1.*",
        "doctrine/dbal": "2.3.*"
    },
    "minimum-stability": "dev",
    "autoload": {
        "psr-0": { "": "src/" }
    }
}

と、最後にdoctrine/dbalを追加すればOKですよ。