Symfony2のテンプレートレンダリング時の名前の指定

Symfony2でテンプレートをレンダリングする場合、以下のようにやや長い名前でテンプレートを指定します。

$this->render('HelloBundle:Hello:index.twig');

この指定はコロンで区切られた3つのパーツで構成されていて、

  1. テンプレートのあるバンドルの名前
  2. テンプレートのあるコントローラーの名前
  3. テンプレートファイル名(とフォーマット、レンダラー)

のようになっています。

現段階ではこの様に3つのパーツで書かないとエラーになりますが、それはFrameworkBundle\Templating\EngineクラスのsplitTemplateName()メソッドで行われています。

<?php
    public function splitTemplateName($name, array $defaults = array())
    {
        $parts = explode(':', $name);
        if (3 !== count($parts)) {
            throw new \InvalidArgumentException(sprintf('Template name "%s" is not valid.', $name));
        }

        $options = array_replace(
            array(
                'format' => '',
            ),
            $defaults,
            array(
                'bundle'     => str_replace('\\', '/', $parts[0]),
                'controller' => $parts[1],
            )
        );

        $elements = explode('.', $parts[2]);
        if (3 === count($elements)) {
            $parts[2] = $elements[0];
            $options['format'] = $elements[1];
            $options['renderer'] = $elements[2];
        } elseif (2 === count($elements)) {
            $parts[2] = $elements[0];
            $options['renderer'] = $elements[1];
            $format = $this->container->get('request')->getRequestFormat();
            if (null !== $format && 'html' !== $format) {
                $options['format'] = '.'.$format;
            }
        } else {
            throw new \InvalidArgumentException(sprintf('Template name "%s" is not valid.', $name));
        }

        return array($parts[2], $options);
    }

バンドル名やコントローラー名など、呼び出されているバンドルやコントローラーのものが自動的に入らないのかなと思ったりしていますが・・・。