[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
@Templateannotation is useful, but also involves some magic. Moreover, most of the time@Templateis 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 aResponseobject.
また、Fabien氏のこの一言 を発端として、正式にdeprecatedにしようかというissue も起票されています。
いちユーザーとしても、 @Template を使わないことによって増える手間と言ったらアクションメソッドのタイプ量がちょこっと増えるぐらいですし、もはや @Template は使わないほうがよさそうな感じですね。
おわりに
というわけで、 @Template を使うのはやめときましょうというお話でした。
Symfony Advent Calendar 2020、明日は @polidog さんです!お楽しみに!
Discussion