Symfony ComponentsとOutput Escaper

11月15-18日に行われている International PHP Conferenceで発表されているらしい資料があり、おもしろいことが色々書いてあったのでご紹介したいと思います。

Symfony Components

Symfony Componentsはsymfonyのコアから独立したライブラリ群です。つい先日のKlabさんとの勉強会の時は知らなかった(知る余地もなかった)内容が色々あったのでそのあたりのことを書きます。

現在公開されているSymfony Components(http://components.symfony-project.org/)には5つのコンポーネントがあり、そのうちRequest Handler以外はソースコードが公開されている、という内容を僕は発表していたのですが、状況は少し変わっていました。

まず新たにOutput Escaperが独立してSymfony Components化されています。中をみてみると、とりあえず抜き出しただけって言う感じでした。既に使われているものなのである程度枯れてるから、十分使いものになる内容だと思います。escaping_helperまわりは少し変わってもおかしくなさそうな気がします。

あとはForm, Command Line Tools(Task), Routing, Security, Cache, DebugなんかもSymfony Componentsの方にいくそうです。 Securityっていうのがよくわからないのですが、2.0関連なのでしょうか。それともUser系のことなのかな。ちょっと気になります。

Symfony 2.0とPHP 5.3

以前Fabien氏が来日した際、名前空間の使用について伺ったところ、「Symfony 2.0では名前空間を使うつもりはない」的なことをおっしゃっていましたそんなことはたぶん言ってない気がします。。。

先日、symfony 1.x legacy websiteというブログが投稿され、Symfony 2ではPHP 5.3が必須になる旨のお話しがありました。個人的にはバックスラッシュが可愛く見えてきたので、名前空間も使われたらいいのになあと期待していました。

色々な資料をみていると、どうやらSymfony 2.0では名前空間も採用されるようです。

現在発表されているのが、

この3つです。これは現段階ではFixではないと思いますが、名前空間を使っていくことは間違いなさそうです。

いままではコードが一切なかったのでなんともいえない感じでしたが、ついに先日、2.0のbranchが切られました。svn.symfony-project.org/componentsにOutputEscaperがいないと思ったら、branches/2.0/lib/Symfony/Componentsの中にいました。いよいよbranchが切られたかと思うとちょっと感動です。

現段階ではComponentsとFoundationのディレクトリがlib直下に作成されており、FoundationにはシンプルなClassLoaderが入っていました。各Componentsはいままで単独でAutoloaderを持っていましたが、Foundation\ClassLoaderを使うようになっています。(正確には共通のClassLoaderにあわせた作りになっているので、各ComponentからAutoloaderはなくなっています。)

Componentsは、名前空間にあわせてディレクトリが切られたりしています。今までは各ComponentのAutoloaderの実装が単純 ― 例えばDependency InjectionであればsfServiceで始まるクラスはAutoloaderと同一ディレクトリにあるものからクラス名.phpファイルをrequireするというもの ― で、ディレクトリの指定とか細かいことは一切しないため、全クラスファイルが同一ディレクトリに入っていました。そのあたりがbranches/2.0の方ではすっきりとした実装になっています。

Frameworkについてはディレクトは存在しておらず、詳細は不明です。いくつかの資料には、\Symfony\Core\Request というようにCore名前空間で書いているものもあったり、実際のところどうなるのかがよくわかってない感じです。個人的にはCoreの方がいいなーと思うんだけどなあ。

あと、Symfony 2.0で用意されるであろうRequest Handlerのイベントが、以前はapplication.load_controllerとかだったけど、core.load_controllerに変わってるっぽいです。こっちの方がどうなるかわかりませんが。。。

とりあえず、現段階で公開されている資料から読み取れるSymfony 2.0のこととかはこんな感じでしょうか。さらにここにDoctrine 2.0が入るわけですが、こっちは先日Alpha3が発表されており、来年の1月にはBeta1がでるとのことでだいぶ固まってきた感じがします。Doctrine 2.0のことはまたおいおい。

Output EscaperのTIPS

何となくOutputEscaperのソースを眺めていて、ふと気づいたことが。OutputEscaperの仕組みって、アクションからテンプレートに変数を渡すときに、エスケープ用のDecoratorオブジェクトで値をラッピング(スカラは直接エスケープ)をして、生の値を取り出すときは $escapingObject->getRawValue() とやりますよね。

んで見ていたのがOutputEscaper/ObjectDecorator.phpの__call()なのですが、引数の一番最後に 'esc_' で始まる文字列を渡すと、対応するescapingMethodが呼ばれる、という仕組みになっています。

つまり、esc_rawはエスケープしないというescapingMethodなので、

<?php 
echo $escapingObject->getDescription('esc_raw');
echo $escapingObject->getRawValue()->getDescription();

上記のコードは両方ともエスケープを外すコードになります。よく見たら1.2のOutputEscaperでも実装されていました。だから何ってほどのものではないのですが、もしエスケープの方法を特定のものだけesc_entitiesに変えたい時などはこれでできそうです。

はやくSymfony 2.0つかいたいよー。