🎻

[Symfony] @Templateアノテーションを使わないほうがいい理由

2020/12/21に公開

はじめに

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',
        ];
    }
}

正常に動かないケースに遭遇

昔からずっと便利に使っていたんですが、最近になってこんな不可解な出来事に遭遇しました。

https://twitter.com/ttskch/status/1337363519063248896

https://twitter.com/ttskch/status/1337367673273896966

https://twitter.com/ttskch/status/1337373726405357570

ツイートのとおりですが、どうも

  1. テストコードにおいて $client->disableReboot() をする
  2. その状態の $client でリダイレクトを行う
  3. すると、リダイレクト先のアクションメソッドにおいて @Tempalte アノテーションが正常に効かない
    • 間違ったテンプレートファイルを開こうとして、必要な変数が渡ってきていないためエラーになる
    • ただし、 @Template をコントローラクラスに対してアノテートしている場合には上記の異常動作になるけど、アクションメソッドに対してあのテーとしていれば正常に動作する

という挙動のようでした。謎すぎるというか、おそらくバグでしょう。

テストコードにおける $client->disableReboot() の意味は以下の過去記事をご参照ください。

[Symfony] 機能テストでコントローラに注入しているサービスをモックする方法

@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 a Response object.

また、Fabien氏のこの一言 を発端として、正式にdeprecatedにしようかというissue も起票されています。

いちユーザーとしても、 @Template を使わないことによって増える手間と言ったらアクションメソッドのタイプ量がちょこっと増えるぐらいですし、もはや @Template は使わないほうがよさそうな感じですね。

おわりに

というわけで、 @Template を使うのはやめときましょうというお話でした。

Symfony Advent Calendar 2020、明日は @polidog さんです!お楽しみに!

GitHubで編集を提案

Discussion