Silexを1.3系から2.0系にアップグレードしたメモ #php #silex

Silex 1.3系から2.0系にアップグレードしたので、自分が使っている範囲で気が付いたことをメモ。内部で使われているDIコンテナであるPimpleのバージョンが3系になったのが一番大きな変化。

Serviceのコンテナへの登録方法が変わった

Services - Documentation - Silex - The PHP micro-framework based on the Symfony Components

// 1.3まで $app['xxx'] = $app->share(function () use ($app) { /* 返す */ };
$app['xxx'] = function () use ($app) { /* 返す */ };

今まで同一のインスタンスを取得するためにshareを書いていたが、いちいち書かなくてよくなった。shareはメソッドごとなくなった。

ServiceProviderの仕組みが変わった

Providers - Documentation - Silex - The PHP micro-framework based on the Symfony Components

今までSilex\ServiceProviderInterfaceを実装していたのがPimple\ServiceProviderInterfaceを実装するように変わった。またregisterメソッドの引数もSilex\ApplicationからPimple\Containerに変わった。

さらにbootメソッドを実装していた場合はSilex\Api\BootableProviderInterfaceの実装として行うこととなった(こちらの引数はSilex\Applicationのまま変わらず)。

もちろん、2つのインターフェースを1つのクラスで実装すれば1.3系のころと同じように使える。

エラーハンドラーの引数が変わった

Usage - Documentation - Silex - The PHP micro-framework based on the Symfony Components

// 1.3まで $app->error(function (\Exception $e, $code) {
$app->error(function (\Exception $e, Request $request, $code) {

エラーハンドラーにSymfony\Component\HttpFoundation\Requestのインスタンスが渡るようになった。エラーハンドラー内でステータスコードで処理を分岐させていた場合、今までコードが渡っていた位置にRequestにインスタンスが渡ってくるのでうまく動かなくなるので注意。

細かいやつ

$app['request']がなくなった

今までだと$appSymfony\Component\HttpFoundation\Requestのインスタンスが格納されていたのだけれど、入らなくなった。今のコードをできるだけ変えたくないのであれば、自分でbeforeミドルウェアの内部などで格納しておく必要がある。

Silex\Provider\UrlGeneratorServiceProviderがなくなった

なくなった。

END

Close