symfony_black_03

こんにちは。Symfony2.0 -> 2.3 へのバージョンアップを成功させたので
大変だったこと、良かったことなどのメモでございます。

バージョンアップは強く推奨

以下に、Symfonyのサポート期間が記されています。
http://symfony.com/doc/current/contributing/community/releases.html#long-term-support-releases

これによると、Symfony2.0 の End of Life は 2013年9月です。
つまり、セキュリティの修正については、今後なされない可能性があります。

あと、新機能や改善も使っていきたいですよね!
今日日、2.1 以上サポートのバンドルなんかもあったりするわけです。
ということで、ぜひとも 2.3 を使っていきたい。

私のアプリの前提

  • PHP5.4
  • Symfony2.0.24で動作
  • Symfony Standard 以外に導入しているバンドルは、 GenemuFormBundle
  • Doctrine ORM は利用していない
  • 多言語対応あり
  • 独自セッションストレージ
  • 自作バンドルは4つ

変更箇所確認

もろ影響を受けた箇所をピックアップ

2.1

  • 独自の依存管理スクリプトを廃止し、Composer へ
  • Form::bindRequest() が非推奨化、Form::bind()へ。(正確には、 今まで bindRequest() が行っていた役割のほか、特定のフィールドのバインドも可能に。)
  • Symfony\Bundle\DoctrineBundle\DoctrineBundle -> Doctrine\Bundle\DoctrineBundle\DoctrineBundle
  • localesession 下ではなく、 request で管理されるようになる。
  • テンプレート中の field_widget block が form_widget_simple block に変更
  • Symfony\Component\HttpFoundation\Session が、 Symfony\Component\HttpFoundation\Session\Session へ変更。
  • framework.session 下の設定名が、 php.ini の設定と互換性のあるものに変更。よりわかりやすくなりました。
  • SizeMinMax validator が、 Range へ名前変更・統合
  • MinLengthMaxLength validator が、 Length へ統合

2.2

  • Symfony\Component\Form\Util\FormUtil::singularify()Symfony\Component\PropertyAccess\StringUtil::singularify()

2.3

  • Form::bind() が非推奨化、同様の役割を Form::submit() が行うようになる。ただし、Form::submit() は、将来的に Request のバインドができなくなる予定。かわりに、 Form::handleRequest() が増えたので、 Request をそのままバインドする場合はこれを使うことになっている。
  • Form::bindRequest() は廃止。即ち、Symfony2.0 で、このメソッドを利用していた場合、Form::handleRequest() を利用すればよいわけです。

こう見ると、2.1 の変更がなかなか革命的なものが多いですね。つまり、この山さえ超えれば案外なんとかなってしまいます。
Form については、それぞれのメジャーバージョンアップで役割分担みたいなのが、結構進んでいる感じですね。
セッション周りについては、2.1 で、改善が加えられ、設定値などについて個人的には扱いやすくなっています。また、2.0 時代にあった、NativeFileSessionStorage が、ちゃんとディレクトリ作ってくれなかった問題なども解消されています。Memcahced などのサポートも最初から用意されていますので、バージョンアップしない手は無いですね。

変更のやり方

自分なりのバージョンアップのやり方は以下のような感じでした

  1. https://github.com/symfony/symfony-standard/commit/214c0bb69cb15bccde098422a53a2ba1c3e43010 などを参考にし、依存管理を composer 化。まずは、composer で Symfony2.0 が動作する状態を作る。
  2. https://github.com/symfony/symfony-standard/blob/2.3/composer.json を参考に、 Symfony2.3 化。Update をすると、ポストスクリプトが動かないことを確認。
  3. AppKernal.php や autoload 周り、config.yml を、最新バージョンに合わせひたすら書き換える。この時点で、Doctrine、Sessionなどの依存があったら、変更があるため書き換える。
  4. ポストスクリプトが動くまで、compseor update。動かなかったら、3を再度実行。
  5. Unit Test がパスするまで頑張る
  6. 最後にひと通り、ページを流し見。特に、Formや、Validator で変更が入っているので、フォームの送信などを確認する。多言語対応している場合は、locale の取得方法が変わっていることに注意する。

うーん。なかなか泥臭いですね。。。特に、 app/console を動作させるまでに、
config.yml を何度書き換えたことか。。。という感じです。

1、2、3 については、無理矢理にも程があったので
https://github.com/symfony/symfony-standard/tree/2.3 から、
新しい Symfony プロジェクトを作成し、 設定を作り、Bundle を一つづつ移植している方式の
ほうが正しかったのかもしれません。

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>