--- Title: 'Silexを1.3系から2.0系にアップグレードしたメモ #php #silex' Keywords: - php - silex Author: hiro_y Web: 'https://mimemo.io/m/vj5XN4jvY486d73' --- [Silex](http://silex.sensiolabs.org/) 1.3系から2.0系にアップグレードしたので、自分が使っている範囲で気が付いたことをメモ。内部で使われているDIコンテナである[Pimple](http://pimple.sensiolabs.org/)のバージョンが3系になったのが一番大きな変化。 ## Serviceのコンテナへの登録方法が変わった [Services - Documentation - Silex - The PHP micro-framework based on the Symfony Components](http://silex.sensiolabs.org/doc/master/services.html) ```php // 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](http://silex.sensiolabs.org/doc/master/providers.html) 今まで`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](http://silex.sensiolabs.org/doc/master/usage.html#error-handlers) ```php // 1.3まで $app->error(function (\Exception $e, $code) { $app->error(function (\Exception $e, Request $request, $code) { ``` エラーハンドラーに`Symfony\Component\HttpFoundation\Request`のインスタンスが渡るようになった。エラーハンドラー内でステータスコードで処理を分岐させていた場合、今までコードが渡っていた位置に`Request`にインスタンスが渡ってくるのでうまく動かなくなるので注意。 ## 細かいやつ ### `$app['request']`がなくなった 今までだと`$app`に`Symfony\Component\HttpFoundation\Request`のインスタンスが格納されていたのだけれど、入らなくなった。今のコードをできるだけ変えたくないのであれば、自分で`before`ミドルウェアの内部などで格納しておく必要がある。 ### `Silex\Provider\UrlGeneratorServiceProvider`がなくなった なくなった。