SilexでHello World


## Sliexとは

sinatraからインスパイアされたPHP 5.3以上で動作するPHPマイクロフレームワーク。Symfony2 のコンポーネントと Pimple を利用して構築されている。

Symfonyの開発元である Sensio Labs より公開されている。
http://silex.sensiolabs.org/

## インストール方法

以前のバージョンではsilex.pherをincludeするという方式だったけど途中からcomposerを使うようになった。composerはrubyで言うbundlerのようなものでライブラリの依存関係を解決してくれる。

```
curl -s http://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```

のようにしてダウンロードしたphpプログラム(composer.phar)をcomposerとしてパスを通しておくといい。

プロジェクトのディレクトリにcomposer.jsonを書く。Gemfileのようなもの。以下の様に書くとSilex 1.0に依存するということになる。

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

プロジェクトディレクトリで以下のコマンドを打つとインストールできる。

```/path/to/project
composer install
```

成功すると依存ライブラリはvendorディレクトリ以下に配置され、composerによってautoloadが可能になる。ドキュメントルートをwebサブディレクトリとして公開するなら以下のような階層になる。

```
├── composer.json
├── composer.lock
├── vendor
│  └── ...
└── web
    └── index.php
```

## Hello World

web/index.phpを以下のように作り、ブラウザでサーバにアクセスするとHello Worldが表示される。返しているのはHTMLではなくただの文字列。

```web/index.php
<?php
require_once __DIR__.'/../vendor/autoload.php'; 

$app = new Silex\Application();
$app->get('/', function() {
    return "Hello World!";
}); 
$app->run(); 
```

## ルーティング

例えば /hello/taroにアクセスしたときにHello taroと出力する場合は以下のように追加できる。

```web/index.php
<?php
require_once __DIR__.'/../vendor/autoload.php'; 

$app = new Silex\Application();
$app->get('/', function() {
    return "Hello World!";
});
$app->get('/hello/{name}', function($name) use($app) { 
    return 'Hello '.$app->escape($name); 
});
$app->run(); 
```

※ 使っているウェブサーバですべてのリクエストをweb/index.phpで処理させるように設定しておくこと。Apacheなら.htaccessなどを使って以下のように書ける。

```web/.htaccess
<IfModule mod_rewrite.c>
    Options -MultiViews

    RewriteEngine On
    #RewriteBase /path/to/app
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
```

PHP 5.4にビルトインウェブサーバ用意されたのでようやくコマンドラインから簡単にウェブサーバを立ち上げられるようになった。

```/path/to/project
php -S 0.0.0.0:8080 -t web
```

その他の主要なWebサーバの設定例については http://silex.sensiolabs.org/doc/web_servers.html を参照。

## テンプレートエンジンを使う

SinatraというかRubyではいろんなテンプレートエンジンが使える。SliexではTwigというテンプレートエンジンがあり、Sensio Labs より公開されているのでこれを使う
### twigのインストール

composer.jsonを以下のように修正する。

```composer.json
{
    "require": {
        "silex/silex": "1.0.*@dev",
        "twig/twig": ">=1.8,<2.0-dev"
    }
}
```

依存ライブラリを更新する。

```/path/to/project
composer update
```

でtwigライブラリが追加される。

### twigを使う

SilexからはServiceProviderとしてtwigを登録して呼び出す。

```web/index.php
<?php
require_once __DIR__.'/../vendor/autoload.php'; 

$app = new Silex\Application();
$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/../views',
));
$app->get('/', function() {
    return "Hello World!";
});
$app->get('/hello/{name}', function($name) use($app) {
    return $app['twig']->render('hello.twig', array(
        'name' => $name,
    ));
});
$app->run();
```

twigコンテナからrenderメソッドでテンプレートファイル、パラメータを指定して出力を返す。hello.twigは以下のようになる。

```views/hello.twig
<!DOCTYPE html>
<html>
  <head>
    <title>Silex</title>
  </head>
  <body>
    <h1>Hello {{ name }}</h1>
  </body>
</html>
```

twigにはレイアウトなどいろいろな機能がある。詳しくは以下を参照。
http://twig.sensiolabs.org/


## プロジェクトのコミット

Silexではなくcomposerの話になってしまうが、composerでインストールしたライブラリはコミットしなくていい。つまりvendorは除外できる。

vendor以外のプロジェクトのファイルと共にcomposer.jsonはもちろんcomposer.lockもコミットする。理由はGemfile.lockと同じで、このファイルがあれば他の開発者や運用環境で同じバージョンの依存ライブラリをスナップショットとして使うことができるから。

他の開発者はプロジェクトを取得し、composer installコマンドでcomposer.lockから依存ライブラリを取得できる。

サンプルコードをgithubにあげてみた。

```
git clone git://github.com/makotokw/php-silex-hello-world.git
cd php-silex-hello-world
composer install
php -S 0.0.0.0:8080 -t web
```

でok。

依存ライブラリを最新に更新するときなどはcomposer updateが使える。