Posted at

SilexでHello World

More than 5 years have passed since last update.


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"
}
}

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

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

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"
}
}

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

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が使える。