Symfony2のアプリ開発4

今日は4億円が貰える券を買いました。年末が楽しみです。

というわけでまだまだ続くこのお話。終わりが全く見えませんが、
一応Symfony2の話については簡単なDBアクセスまで書く予定です。
あくまでも予定ですので、途中で飽きて備忘録等になるかも知れませんがその時はお許しを。


早速前回の続きでコントローラの話です。
前回ではコントローラはrouting.ymlとマッチングするという所まで書きました。

じゃあ、そのrouting.ymlとは何者かを書いていきましょう。


routing.ymlとは以下のように記述するとフレームワーク側でうまいこと処理してくれます。
なんでこうなるのだではなく、こうなんだという事を覚えてください。

app_sample_homepage:
    pattern:  /hello/{name}
    defaults: { _controller: AppSampleBundle:Default:index }


じゃあこの中身を説明しましょう。
app_sample_homepageとは、アプリ内で使用するエイリアス名みたいなものです。定義に別名をつけたもんですね。
その次からが重要になります。

必ず字下げを行って書いてください。字下げで書かないとエラーになります。
patternとは、URLのリソースの定義となります。前回説明したようにURLに/helloと書くのは、
このpatternが/helloと定義されているからです。
ちなみに{name}というのはURLパラメータとなります。


じゃあ、そのURLとコントローラを結びつけるのはどれかというとdefaultsになります。
defautls定義に書いてある内容はというと、
_controllerというのは、コントローラを使う時に書く物です。
ここはこう書くもんだと覚えてください。(サービスを定義する時は違うんだけど。。。)
AppSmpleBundleというのは、バンドル作成時に

php app/console generate:bundle --namespace=App/SampleBundle --format=yml

とnamespaceにApp/SampleBundleに書きましたね。この事になります。
AppSampleBundleはフレームワーク側で管理される論理名になります。
詳しくは後ほど。

DefaultというのはDefaultControllerクラスのControllerを取った定義となります。

ちょっと話がそれますが、Contorollerクラスを作成する時は、
必ずXXXXControllerとControllerをprefixとしてつける必要があるのです。
これはルールです。
で、XXXX部分だけを定義します。

indexというのはindexAction関数の事になります。これもControllerと一緒で、
必ずXXXXActionとActionをprefixとしてつける必要があります。

この部分の事ね。

・・・・
class DefaultController extends Controller
{
    public function indexAction($name)
    {
・・・・


このようにControllerクラスをルールに従って書く事で、
routing.ymlに書いた内容とマッチする事により指定したコントローラが呼び出されます。


ずらずらと書きましたがまとめて書くと、

コントローラを参照する場合、BUNDLE_NAME:CONTROLLER_NAME:ACTION_NAME という記法でアクションメソッドを指定します。
AppSampleBundle:Default:indexの場合、App\SampleBundle\Controller\DefaultControllerクラスのindexActionメソッドにマップされます。

ということになります。


じゃあ、なぜDefaultControllerクラスがAppSampleBundleと書くだけで参照可能かというと、
Symfony/app/AppKernel.php
の中身を開くと、

    public function registerBundles()
    {
        $bundles = array(
            ・・・
            new App\SampleBundle\AppSampleBundle(),

と定義されています。これはバンドル作成時に自動的に追加されます。
これでAppSampleBundleがSymfony2で管理されるようになり、参照可能となります。(厳密に言うとちょっと違うのですが。。。)



このControllerについてはrouting.ymlを使わなくてもアノテーションを使ってマッチングさせる事ができます。

SAStrutsの経験がある方なら、Actionを作成した時に書くあのやり方ですね。
次回はその説明をします。


(追記 2013/03/03)
ここまで書いて約3ヶ月もほったらかしにしてるけど、需要があれば続きを書くけどAnalyticsを見ても特になさそうだしどうしよう。。。