コントローラをサービスとして定義する方法¶
Symfony のガイドブックでは、:class:Symfony\Bundle\FrameworkBundle\Controller\Controller クラスを拡張したコントローラの利便性を学んできました。もちろんこれでも十分ですが、コントローラはサービスとしても指定することができます。
サービスとして定義されたコントローラを問い合わせるには、シングルコロン(:)表記法を使用します。例えば、 my_controller というサービスを定義したとします。そして、そのサービスの indexAction() メソッドへフォワードしたいとします。その際には次のようにします。:
$this->forward('my_controller:indexAction', array('foo' => $bar));
ルーティングの controller の値の定義には、上記と全く同じ表記法を使用する必要があります。
my_controller:
pattern: /
defaults: { _controller: my_controller:indexAction }
このようにコントローラを使用するには、サービスコンテナコンフィギュレーションに定義していなければなりません。詳細は、 Service Container を参照してください。
一般的に、サービスとして定義されたコントローラを使用するには、ベースの Controller クラスの拡張はしません。ショートカットメソッドを使用するのではなく、直接必要なサービスとやりとりを行います。幸運なことに、これはとても簡単ですし、ベースの Controller クラス自体は、多くの共通の処理を実行する巨大なソースに過ぎないのです。
Note
サービスとしてコントローラを指定することは、さらにアドバンテージがあります。それは、コントローラに渡された全てのコントローラ、もしくはサービスは、サービスコンテナコンフィギュレーションを介して変更することができることです。これは、オープンソースバンドルなどたくさんの異なるプロジェクトで使われるバンドルを開発する際に、特に便利です。そのため、実際にあなたがサービスとしてコントローラを指定することがなくても、オープンソースのバンドルで使われているのを見ることでしょう。