[Symfony] @Templateアノテーションを使わないほうがいい理由
はじめに
Symfony Advent Calendar 2020 の21日目の記事です!🎄🌙
昨日は @kaino5454 さんの Symfony4でポケモンおすすめパーティを自動生成するアプリを作ってみた でした✨
ちなみに、僕はよく TwitterにもSymfonyネタを呟いている ので、よろしければぜひ フォローしてやってください🕊🤲
@Tempalte
アノテーションとは
@Template
アノテーションは、 SensioFrameworkExtraBundle が提供しているアノテーションの1つで、コントローラのアクションメソッドとビューのテンプレートファイルの紐付けを自動で判定してくれるやつです。
// Before
class FooController
{
public function index()
{
return $this->render('foo/index.html.', [
'var' => 'value',
]);
}
}
// After
/**
* @Template()
*/
class FooController
{
public function index()
{
return [
'var' => 'value',
];
}
}
// または
class FooController
{
/**
* @Template()
*/
public function index()
{
return [
'var' => 'value',
];
}
}
正常に動かないケースに遭遇
昔からずっと便利に使っていたんですが、最近になってこんな不可解な出来事に遭遇しました。
ツイートのとおりですが、どうも
- テストコードにおいて
$client->disableReboot()
をする - その状態の
$client
でリダイレクトを行う - すると、リダイレクト先のアクションメソッドにおいて
@Tempalte
アノテーションが正常に効かない- 間違ったテンプレートファイルを開こうとして、必要な変数が渡ってきていないためエラーになる
- ただし、
@Template
をコントローラクラスに対してアノテートしている場合には上記の異常動作になるけど、アクションメソッドに対してあのテーとしていれば正常に動作する
という挙動のようでした。謎すぎるというか、おそらくバグでしょう。
テストコードにおける
$client->disableReboot()
の意味は以下の過去記事をご参照ください。
@Template
はほぼ非推奨
実は、The Symfony Framework Best Practices (Symfony Best Practices) においても、以下のように 「 @Template
アノテーションは使うべきでない」と明言されています。
The
@Template
annotation is useful, but also involves some magic. Moreover, most of the time@Template
is used without any parameters, which makes it more difficult to know which template is being rendered. It also hides the fact that a controller should always return aResponse
object.
また、Fabien氏のこの一言 を発端として、正式にdeprecatedにしようかというissue も起票されています。
いちユーザーとしても、 @Template
を使わないことによって増える手間と言ったらアクションメソッドのタイプ量がちょこっと増えるぐらいですし、もはや @Template
は使わないほうがよさそうな感じですね。
おわりに
というわけで、 @Template
を使うのはやめときましょうというお話でした。
Symfony Advent Calendar 2020、明日は @polidog さんです!お楽しみに!
Discussion