Symfony2のBeta1で初めてのBundleを作る

いつの間にやらSymfony2のbeta1が公開されていたので、
そろそろ何かを作って行きます。


最初はどうやってバンドルを作るかから始めます。
もちろん試行錯誤しながらです。


今回はRenmen/ShipmentBundleを作成します。
bundleは/src直下にvender/bundleという形式で作成します。
だから今回は以下のフォルダを作ります。

/src/Renmen/ShipmentBundle


受け入れ先ができたらいよいよファイルを作成します。
ファイルの命名はVenderBundle.phpです。

<?php
// /src/Renmen/ShipmentBundle/RenmenShipmentBundle.php

namespace Renmen\ShipmentBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class RenmenShipmentBundle extends Bundle {
}


以上が、(おそらく)最小のBundleです。
もちろんこのままではただそこにあるだけなので、
今回はControllerを追加し、何かを表示したいと思います。


ControllerはVender/Bundle/Controllerフォルダに格納されます。

/src/Renmen/ShipmentBundle/Controller


次にファイル名ですが、なんでも良いです。
なぜかというと後述しますがrouting.ymlにて
ファイル名を指定するという作業があるためです。


ただまぁ、あまり変な名前をつけてもどうかと思うので
ここでは無難にShipmentControllerとしておきます。

<?php
// /src/Renmen/ShipmentBundle/ShipmentController.php

namespace Renmen\ShipmentBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class ShipmentController extends Controller
{
    /**
     * @extra:Route("/", name="_shipment")
     */
    public function indexAction()
    {
        return new Response('This is a page made by ShipmentBundle');
    }
}


以上でbundleの作成は終わりですがSymfony2へbundleを追加するために
routing.yml、AppKernel.php、autoload.phpへ書き加えます。


/app/config/routing.yml

_shipment:
resource: "@RenmentShipmentBundle/Controller/ShipmentController.php"
type: annotation
prefix: /shipment


/app/AppKernel.php

<?php

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            (略...)
            new Acme\DemoBundle\AcmeDemoBundle(),
            new Renmen\ShipmentBundle\RenmenShipmentBundle(),
        );


/app/autoload.php

<?php
$loader->registerNamespaces(array(
    (略...)
    'Acme'             => __DIR__.'/../src',
    'Renmen'           => __DIR__.'/../src',
));

さて、いよいよ /renmen/ へアクセスすると

This is a page made by RenmenShipmentBundle

と表示されるはずです。


と、ながながと説明しましたが、今の工程は

php app/console init:bundle "Renmen/ShipmentBundle" src

というコマンドによってかなり省略できます。


現状での不満点はautoloader.phpとAppKernel.phpの両者へ
変更を加えなければいけないところでしょうか。
routing.ymlも含めると3ファイルもいじらなくてはいけません。
何とかならないのかなぁ。


ということで、本日はここまでにしたいと思います。
もっと丁寧な解説がほしい人は公式サイトを見てね!


http://symfony.com/doc/current/book/page_creation.html