WebMatrix+Symfony2 Bundleを作って表示させる

引き続きWebMatrix+Symfony2シリーズ。

SymfonyはBundleという「プラグインのすごい版」を組み合わせて作っていくようになっているとのこと。だいたい投稿管理、ユーザー管理、みたいに機能の単位で切っていくような想定みたいです。

コンソールからスケルトンを作ります。

C:\Users\iseebi\Documents\My Web Sites\WebSite1\Symfony\app>console init:bundle "Iseteki\SampleBundle" src
Summary of actions
- The bundle "IsetekiSampleBundle" was created at "src/Iseteki/SampleBundle" and is using the namespace "Iseteki\SampleBundle".
- The bundle contains a sample controller, a sample template and a sample routing file.

Follow-up actions
- Enable the bundle inside the AppKernel::registerBundles() method.
      Resource: http://symfony.com/doc/2.0/book/page_creation.html#create-the-bundle
- Ensure that the namespace is registered with the autoloader.
      Resource: http://symfony.com/doc/2.0/book/page_creation.html#autoloading-introduction-sidebar
- If using routing, import the bundle's routing resource.
      Resource: http://symfony.com/doc/2.0/book/routing.html#including-external-routing-resources
- Starting building your bundle!
      Resource: http://symfony.com/doc/2.0/book/page_creation.html#the-hello-symfony-page

app/AppKernel.php の registerBundles に追加する

    public function registerBundles()
    {
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\ZendBundle\ZendBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
            new Symfony\Bundle\AsseticBundle\AsseticBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
            new Acme\DemoBundle\AcmeDemoBundle(),
            
            new Iseteki\SampleBundle\IsetekiSampleBundle(), // add
        );

        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
            $bundles[] = new Symfony\Bundle\WebConfiguratorBundle\SymfonyWebConfiguratorBundle();
        }

        return $bundles;
    }

app/autoload.php名前空間を追加する。

$loader->registerNamespaces(array(
    'Symfony'          => array(__DIR__.'/../vendor/symfony/src', __DIR__.'/../vendor/bundles'),
    'Sensio'           => __DIR__.'/../vendor/bundles',
    'JMS'              => __DIR__.'/../vendor/bundles',
    'Doctrine\\Common' => __DIR__.'/../vendor/doctrine-common/lib',
    'Doctrine\\DBAL'   => __DIR__.'/../vendor/doctrine-dbal/lib',
    'Doctrine'         => __DIR__.'/../vendor/doctrine/lib',
    'Zend\\Log'        => __DIR__.'/../vendor/zend-log',
    'Assetic'          => __DIR__.'/../vendor/assetic/src',
    'Acme'             => __DIR__.'/../src',
    'Iseteki'          => __DIR__.'/../src',
));

app/config/routing.yml に追加する

_sample:
    resource: "@IsetekiSample/Resources/config/routing.yml"

src/Iseteki/SampleBundle/Resources/config/routing.yml のコメントアウトを解除

homepage:
    pattern:  /sample/
    defaults: { _controller: IsetekiSampleBundle:Default:index }

これで http://localhost:8080/Symfony/web/app_dev.php/sample/ を開くと何かしら表示されるはずなんですが、エラーになってしまいました。

どうやら、バンドルサフィックスがPR9だけ違うらしいです。


というわけで、src/Iseteki/SampleBundle/Resources/config/routing.yml を修正。

homepage:
    pattern:  /sample/
#    defaults: { _controller: IsetekiSampleBundle:Default:index }
    defaults: { _controller: IsetekiSample:Default:index }

さらに今度はテンプレートが参照できなくなるので、src/Iseteki/SampleBundle/Controller/DefaultController.php を修正。

    public function indexAction()
    {
        //return $this->render('IsetekiSampleBundle:Default:index.html.twig');
        return $this->render('IsetekiSample:Default:index.html.twig');
    }

再度開くと

Hello!

とだけ表示されたページが出てきました。

PR9だけのルールで、今後のリリースで元に戻るそうですので、あえてPR8に戻すという選択肢もあります。が、ひとまずはこのままいってみようとおもいます。

Twitterでアドバイスいただいた @hidenorigoto さん、@brtriver さん、ありがとうございました!