2011年11月2日水曜日

Symfony2でxml表示

Symfony2でhtmlではなく、xmlを表示するように作りたいので調べてみました。

助けてもらってばかりで足を向けて寝れない、日本symfonyユーザー会クイックツアー コントローラーにそれっぽい記述があるので試してみました。

# src/Acme/PagesBundle/Controller/PagesController.php
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

...

 /**
 * @Route("/xml", defaults={"_format"="xml"}, name="_xml")
 * @Template()
 */
 public function xmlAction()
 {
  return $this->render('AcmePagesBundle:Pages:xml.xml.twig');
 }

# src/Acme/PagesBundle/Resources/views/Pages/
pc_home.html.twig
...
<a href="{{ path('_xml') }}">XML test</a>
...

# src/Acme/PagesBundle/Resources/views/Pages/xml.xml.twig
<test>
 xml test
</test>


これでOKかなと、ブラウザでアクセスするとエラーが表示される。
An exception has been thrown during the rendering of a template ("Route "_xml" does not exist.") in "AcmePagesBundle:Pages:pc_home.html.twig" at line 15.

「_xml」っていう名前のルートは設定されてないよ。って意味かな?多分。...速く英語勉強しないとダメだなぁ。

そんなこんなで色々と試して結局以下のように書いたら動いた。
# src/Acme/PagesBundle/Controller/PagesController.php
 public function xmlAction()
 {
  return $this->render('AcmePagesBundle:Pages:xml.xml.twig');
 }
useとアノテーションを消す。

# src/Acme/PagesBundle/Resources/views/Pages/
pc_home.html.twig
...
<a href="{{ path('AcmePagesBundle_xml') }}">XML test</a>
...
このルーティングの名前を変更。

# src/Acme/PagesBundle/Resources/views/Pages/xml.xml.twig
<test>
 xml test
</test>
このファイルは変更なし。

# src/Acme/PagesBundle/Resources/config/routing.yml
...
AcmePagesBundle_xml:
 pattern: /xml
 defaults: { _controller: AcmePagesBundle:Pages:xml, _format: xml }
通常のルーティングの設定に「_format: xml」を追加。

これで何とかxmlで表示されるように動いた。

FirefoxのFirebugでコンテンツタイプを見てみても
Content-Type text/xml; charset=UTF-8
って出てる。ヨシヨシ。

...ただ、アノテーション使う方式は何がダメだったのかなぁ。謎は残ったままです。

0 件のコメント:

コメントを投稿