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に依存するということになる。
{
"require": {
"silex/silex": "1.0.*@dev"
}
}
プロジェクトディレクトリで以下のコマンドを打つとインストールできる。
composer install
成功すると依存ライブラリはvendorディレクトリ以下に配置され、composerによってautoloadが可能になる。ドキュメントルートをwebサブディレクトリとして公開するなら以下のような階層になる。
├── composer.json
├── composer.lock
├── vendor
│ └── ...
└── web
└── index.php
Hello World
web/index.phpを以下のように作り、ブラウザでサーバにアクセスするとHello Worldが表示される。返しているのはHTMLではなくただの文字列。
<?php
require_once __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app->get('/', function() {
return "Hello World!";
});
$app->run();
ルーティング
例えば /hello/taroにアクセスしたときにHello taroと出力する場合は以下のように追加できる。
<?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などを使って以下のように書ける。
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
#RewriteBase /path/to/app
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
PHP 5.4にビルトインウェブサーバ用意されたのでようやくコマンドラインから簡単にウェブサーバを立ち上げられるようになった。
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を以下のように修正する。
{
"require": {
"silex/silex": "1.0.*@dev",
"twig/twig": ">=1.8,<2.0-dev"
}
}
依存ライブラリを更新する。
composer update
でtwigライブラリが追加される。
twigを使う
SilexからはServiceProviderとしてtwigを登録して呼び出す。
<?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は以下のようになる。
<!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が使える。