私はsymfony2の使い方を学んでいますが、サービスレイヤーとは何か、どこで使用できるかを学ぶのに苦労しています。
symfony2 のサービス層について理解を深めるにはどうすればよいですか
サービスを説明するために最善を尽くしますが、Symfony2 のドキュメントは私ができるよりも優れた仕事をしています。
本質的に、サービスは単なるクラスです。クラスは、Symfony2 に登録されるとDependency Injection Container
(またはContainer
略して) サービスになります。この時点で、クラスはアプリケーションのサービス層の一部になります。
サービスには依存関係がある場合があります (多くの場合、依存関係があります) が、必須ではありません。サービスは、多くの場合、他のサービスの依存関係として使用されます。例を挙げましょう:
EmailSender
SmtpTransport
EmailSender
の形で依存関係がありSmtpTransport
ます。言い換えれば、 for のEmailSender
ジョブを実行できるようにするには、 のインスタンスをSmtpTransport
注入する必要があります。(EmailSender
依存関係はありますが、そうでSmtpTransport
はないことに注意してください。)EmailSender
アプリの 5 つの異なる場所で使用する必要があるとします。各スポットには、次のようなコードがある場合があります。
$emailSender = new EmailSender(new SmtpTransport());
$emailSender->send($email)
これは多くのコードではありません (EmailSender
依存関係が 1 つしかないため) が、SMTP を使用する代わりにEmailSender
トランスポート クラスを使用する必要があると判断した場合はどうなりますsendmail
か? 更新するには、コードの各ブロックを編集する必要があります。
別の方法は、サービスとして登録EmailSender
し、その依存関係を登録することです。
登録は次のようになります。
// YourApp/YourBundle/Resources/config/services.yml
services:
smtp_transport:
class: YourApp\YourBundle\Email\SmtpTransport
email_sender:
class: YourApp\YourBundle\Email\EmailSender
arguments:
- @smtp_transport
さて、それを使用するには(container
意識的なコンテキストから):
$container->get('email_sender')->send($email);
クラスを実際に使用して電子メールを送信する方が、はるかに単純でクリーンであることに気付きましたか? もちろん、最初にサービスを登録する作業を行う必要がありますが、それは些細なことであり、一度だけ行う必要があります。
EmailSender
1 つではなく 3 つの依存関係があると想像してください。サービスを使用すると、実装コード (電子メールの送信に使用されるコード) を変更する必要がなく、サービス登録を変更するだけで済みます。
つまり、サービス層は、a) 1 つまたは複数の依存関係を持ち、b) 「グローバル」スコープで使用する必要があるクラスの中央リポジトリとして機能します。これらのサービス クラスを からフェッチすることDependency Injection Container
で、コードの冗長性が減り、広範な変更を簡単に行うことができます。
私は間違っているかもしれませんが、Symfony2 は依存性注入コンテナーを実装する最初の PHP フレームワークだと思います。そのため、多くの PHP 開発者はサービスの概念に慣れていない可能性があります。非常に強力なツールであることがわかるので、完全に理解することをお勧めします。さらに、サービスの概念は Symfony2 や PHP に限定されるものではありません。さまざまなフレームワークや言語でこの概念を利用できます。
このテーマに関する Fabien の一連の記事を試してみてください: Dependency Injection。