あけましておめでとうございます

2014年です。ついでに、25歳になりました。
平成になって生まれましたが、平成が四半世紀おわったわけです。
すごいですね。

というわけで、今年は、20歳から5年。今の仕事はじめて3年目ということで、
原点復帰の年にしたいと思います。

仕事面では、かねてよりやろうと思って、チマチマ準備していたリリース全自動化 (Capistrano を使う
というレベルではなくビルドから承認フローも含めた感じのもの) を実践していく感じで
諸諸やっております。

Symfony諸諸の話では、去年の末にリリースされた 2.4 を本番環境で使う予定で居ます。
hosts による、リクエストの制限機能とかがすごく使えそうです。

LTS で切り替えていこうかな、と思っていたものの、2.0 -> 2.3 が思った以上に大変だったので、
細かくバージョンアップする戦術に変えていきたいです。

あとは、「彼女ができる」とか、変なことを掲げたりもしているのが今年です。

技術ブログは不定期ながら月に4回くらいは書きたいなーということで、最近趣味で触り始めた、
angular.js のネタとかをお送りしますよ。

それでは、本年もよろしくお願い致します。

symfony_black_03

この前、Symfonyを2.3 に上げたばかりだというのに、Symfony2.4 beta-1
が出るようです。正直 2.0 → 2.3 は差分を見るのが大変辛かった。これを反省に
チマチマ何が増えたり減ったりしたか、ちゃんと見ていくことにしたいです。

2.3からの変更が必要な箇所

Form

  • IntegerToLocalizedStringTransformer のコンストラクタである $precision は完全に無視されます。なぜならば、精密さは integer にとって必要ないからです。

また、Formの変更か!と思いつつ、今のところ、これまでの動きを破壊するのは
これくらいのようです。
IntegerToLocalizedStringTransformer は  NumberToLocalizedStringTransformer  の子クラスです。この
NumberToLocalizedStringTransformer は、数値の切り上げ、切り捨てなどを
担当するようです。integer は、整数だからつかわんよねー。ということで、
強制的に内部で 0 になるように変更になっていました。

2.4での新機能 (現時点)

Console Component の改良

http://symfony.com/blog/new-in-symfony-2-4-console-improvements?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+symfony%2Fblog+(Symfony+Blog)

ちまちまPHPでツールを作る身として、嬉しいのは Console Component
の改良でしょう。Console Component は、PHPUnit といった幅広いツールで
利用されているコンポーネントです。
その高機能っぷりは、もはやPHPでコンソールツールを作るときの、
デファクト・スタンダードではないかと思います。

  • Command において、 parent::__construct() を呼ぶのを忘れた時に、マシなエラーメッセージが出るようにした。
  • TableHelper に、よりコンパクトなレイアウトが登場。
  • Verbosity オプションが付けられているかどうかを判定する便利メソッドが登場
  • Terminal Dimensions (ターミナルの大きさ) を設定する方法が登場
  • サービスタグ (console.command) によりコマンドを追加する方法が登場

Verbosity を判定する方法の追加は、もっとスマートに書けないかと思っていたので
ありがたい変更です。
また、サービスタグによるコマンドの追加については、ブログにて

This new way of registering commands plays nicely with the old ways (via auto-discovery in the bundles.) and you can mix and match both.

と、Fabian が申しているので、古い方法である、特定の名前の名前空間に
コマンドクラスを定義していく方法とは、併用が可能のようです。

Callback constraintの表現簡略化

http://symfony.com/blog/new-in-symfony-2-4-a-better-callback-constraint

validation で、汎用でない特定のエンティティ用の複雑なロジックを利用する場合、
Callback constraint が便利です。が、今まではちょっと複雑だったよね
ということで、もうちょっと簡単に表現できるようになりました。

Yaml だと、そんなに大差無いと思います。一方、Annotation だと
今までクラス部分に対して宣言していたものが、バリデーションのメソッドに対して
つくようになりました。どれがバリデーションメソッドかが、ひと目でわかります。

Annotation厨歓喜。

DowCrawler Component で名前空間の扱いが便利に

http://symfony.com/blog/new-in-symfony-2-4-namespaces-auto-discovery-in-dowcrawler

今まで、名前空間を考慮したデータの取得には苦労していたようですが、
名前空間について、そこまで心配せずともデータを取得する方法が登場しました。

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 を一つづつ移植している方式の
ほうが正しかったのかもしれません。