Symfony2のテンプレートレンダリング時の名前の指定
Symfony2でテンプレートをレンダリングする場合、以下のようにやや長い名前でテンプレートを指定します。
$this->render('HelloBundle:Hello:index.twig');
この指定はコロンで区切られた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); }
バンドル名やコントローラー名など、呼び出されているバンドルやコントローラーのものが自動的に入らないのかなと思ったりしていますが・・・。