Silexを1.3系から2.0系にアップグレードしたメモ #php #silex version 4
Silexを1.3系から2.0系にアップグレードしたメモ #php #silex
[Silex](http://silex.sensiolabs.org/) 1.3系から2.0系にアップグレードしたのでメモ。
内部で使われているDIコンテナである[Pimple](http://pimple.sensiolabs.org/)のバージョンが3系になったのが大きな変化。
[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`がなくなった
なくなった。
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']
がなくなった
今までだと$app
にSymfony\Component\HttpFoundation\Request
のインスタンスが格納されていたのだけれど、入らなくなった。今のコードをできるだけ変えたくないのであれば、自分でbefore
ミドルウェアの内部などで格納しておく必要がある。
Silex\Provider\UrlGeneratorServiceProvider
がなくなった
なくなった。