symfonyTweetこんにちは。今週からアシアルのオフィスの一部でフリーアドレス制度が導入されました。先月なかごろにプレビュー版がリリースされました。ご存じの方もいらっしゃると思います。2で作るアプリケーションの構成はどのようになるか、ということをお話ししたいと思います。2の特徴をざっくり書いてみたいと思います。5.3といえば名前空間です。2.0は名前空間を利用しています。これによりコードがシンプルになります。クラス名や関数名の衝突を気にする必要がなくなります。1系はよく重いといわれます。この点が大幅に改善されたようです。変わっているのがアクションにたどり着くまでのプロセスです。アプリケーションの中核となるクラスがSymfony\Foundation\Kernelです。このクラス自身はとてもシンプルに作られています。Requestを受けてResponseの作成までの一連の処理を担うSymfony\Components\RequestHandler\RequestHandlerクラスもとてもシンプルに作られています。この2つのクラスがアプリケーション全体の流れを構成します。2のスタンスとなります。2にはオブジェクトの依存性をなくすためのコンポーネントが2つあります。1つは以前から実装されていたEventDispatcherです。新たに実装されたのがDependencyInjectionというコンポーネントです。Injectionについては、Fabien氏のブログを読むと分かりやすいと思います。Injection?)これによりフレームワークの拡張がより簡単になります。DIがよくわからない人も、多分使うようになるとわかるかなと思いますので、あまり心配しなくてもよいでしょう。2ORMであるDoctrineも新しいものになります。これも以前のDoctrineに比べてとても高速で軽量になります。Symfony自体の軽量化と合わせて、大きなパフォーマンスの改善が見込めそうです。Frameworkを利用するようになります。SwiftMailerやDoctrineもそうですが、他のフレームワークとの連携を行うことでより品質の高いものができると思いますのでいいことかなと思います。変更点をいくつかあげてみましたが、実際にSymfonyで作るアプリケーションがどのようになるのかはわからないかと思います。現在GitHub上にsandboxが上がっていますので、それを見てみるのが手っ取り早いと思います。Worldに毛が生えた程度のアプリケーションが最初から含まれています。実際にディレクトリ構成やクラスの内部など、簡単に説明していきます。sandboxのディレクトリ直下です。webという3つのディレクトリがあると思います。ファイルはどうでもいいので無視です。webディレクトリ一番とっつきやすいのはwebでしょう。従来のwebと同じように、ドキュメントルートとなるディレクトリです。中には見慣れたファイルがあると思います。index.phpとindex_dev.phpは依然と同じくフロントコントローラで、index_dev.phpは開発環境用のフロントコントローラにあたります。次にhelloとsrcです。どちらも今までのディレクトリ構成にはなかったものです。中身がシンプルなのはhelloディレクトリのほうなので、そちらから先にみていきます。helloディレクトリhelloディレクトリの中身は次のようになっています。logs/先ほど説明をしたKernelというものが出てきます。Kernelの中にはいくつかのメソッドが実装されています。◆registerRootDir()Kernelのルートとなるディレクトリです。カーネルを配置してあるディレクトリ、ここではhelloがカーネルの名称、つまりアプリケーションの名称となります。◆registerBundles()Bundleとは日本語にすると束とか1つにまとめたものという意味です。2では非常に重要な役割を持ちます。このメソッドの中でZendBundleやDoctrineBundleを返しているのをみると、Bundleは従来のPluginのように思われるかもしれませんが、あながち間違いではないでしょう。Kernelで必要となるBundleをKernel自身に登録するメソッドです。このメソッドの中で返している配列の最後に、Application\HelloBundle\Bundleというクラスを渡しています。Application\HelloBundleという名前空間から想像がつくかもしれませんが、これはアプリケーションの実態です。実際にBundleにどういったものが含まれるのかは後ほど説明します。◆registerBundleDirs()Bundleが配置してあるディレクトリを登録します。名前空間を修飾したクラス名のプレフィックスに応じて設定します。◆registerContainerConfiguration()DIコンテナのKernelごとの設定の読み込みを行います。基本的にはBundle単位で設定されていますが、必要に応じて追加・修正などを行うものと思われます。◆registerRoutes()ルーティングの設定の読み込みを行います。従来はアプリケーションごとにrouting.ymlがあり、もしプラグインでモジュールが提供されていればそれに対するルーティングを1つずつ定義するようになっていました。今回はBundle単位でrouting.ymlの定義が可能になっています。その設定を別のrouting.ymlからまとめて読み込む、ということが可能になりました。ルーティングの仕組み自体は基本的には従来と同じような感覚で使えるのかなと思っています。Kernelクラスをざっと説明しましたが、基本的にはこれらの内容が記述された状態で自動生成することになるのかなと思います。内部が柔軟な仕組みなので、こうしてある程度定義されているほうが修正がしやすいと思います。Kernelクラスの説明が終わったら、あとは大したことありません。logsとcacheは名前の通りログとキャッシュが保存されます。キャッシュにはDIコンテナの情報やルーティング関連などが出力されるようです。前回同様にこのディレクトリにはWebサーバからの書き込みを許可するようにパーミッションの設定が必要になります。consoleというファイルはコマンドです。従来のsymfonyコマンドのように、このコマンド経由でスケルトンの生成などを行うことになると思います。--shellオプションを付けると対話式のシェルとして実行可能なので、コマンドを連続して実行するときには便利かと思います。現在そこまでコマンドは多くないので、実装が固まってきたらより突っ込んでみていきたいと思います。helloディレクトリの中でほかに説明していないのは残すところconfigディレクトリだけになりましたが、すでに中に入っているファイルに関して触れてしまっていますね。2にはDIコンテナがありますので、基本的にはDIコンテナに必要な修正をYAMLに書き足していくようになるのでしょうか。DIコンテナの設定をするためのファイルは1つでなくてもいいようなので、役割に応じてYAMLファイルを追加するようになるのかと思います。現状は必要最低限の設定ファイルだけを配置している可能性もありますし、このあたりの設定に関してはなんとも言えないところです。helloディレクトリの中をざっくり説明しました。要するに、アプリケーションとしての設定関連をまとめたディレクトリでしょうか。Kernel次第でアプリケーションの内容をごっそり切りかえることも可能になります。読み込むBundle次第で、複雑なアプリケーションにもなりますし、簡潔なアプリケーションにもなるでしょう。従来のsymfonyでは小さなアプリケーションでも様々な処理を必要としていましたので、いくらでも簡潔に作れるというのは大きな魅力だと思います。srcディレクトリさて、残っているのはsrcディレクトリです。ディレクトリ構成を見てみます。vendor/実際のロジックが詰まったBundleがこのsrcディレクトリに入るようになります。ApplicationにはApplicationとして動作させるためのBundleが入ります。中にはHelloBundleというBundleがありますのでわかりやすいですね。Bundleディレクトリは空っぽです。このディレクトリは従来ののプラグインのような形で、様々なBundleを入れていくのかなと思います。autoload.phpはオートロードに関するファイルですので特に気にしないでいいでしょう。sandboxではsymfonyやDoctrineなどのコードが含まれています。Bundleではなく外部ライブラリを使いたい場合は、このディレクトリに配置します。今回だけでは説明しきれないので、helloアプリケーションのロジックが詰まっているHelloBundleだけ説明します。Applicationディレクトリの中にHelloBundleというディレクトリがありますが、これがHelloBundleです。中身は以下のようになっています。Resources/全てのBundleに共通しているのは、BundleのディレクトリにはBundle.phpというクラスファイルが存在しています。デフォルトでは空のクラスになっていると思いますが、BundleごとのDIコンテナの設定などが必要な場合はここに処理を追加していきます。次にControllerディレクトリです。名前からも想像がつくと思いますがControllerクラスを配置します。ControllerディレクトリにはHelloController.phpがありますのでみてみます。}}indexAction()メソッドがアクションになります。2ではルーティングと連動して引数を受け取るようになります。Controllerはこの程度にしておいて、Resourcesを見てみましょう。configとviewディレクトリがあると思います。configにはrouting.ymlがありますので見てみましょう。}今までのものとなんとなく似ていますね。pattern属性に:nameという部分がありますが、この部分がHelloControllerのindexActionへ引数として渡されます。してやれば取得可能なようです。