4

私はsymfony2の使い方を学んでいますが、サービスレイヤーとは何か、どこで使用できるかを学ぶのに苦労しています。

symfony2 のサービス層について理解を深めるにはどうすればよいですか

4

2 に答える 2

8

サービスを説明するために最善を尽くしますが、Symfony2 のドキュメントは私ができるよりも優れた仕事をしています。

本質的に、サービスは単なるクラスです。クラスは、Symfony2 に登録されるとDependency Injection Container(またはContainer略して) サービスになります。この時点で、クラスはアプリケーションのサービス層の一部になります。

サービスには依存関係がある場合があります (多くの場合、依存関係があります) が、必須ではありません。サービスは、多くの場合、他のサービスの依存関係として使用されます。例を挙げましょう:

  • あなたは、電子メールを送信するために使用されるクラスを持っています。EmailSender
  • SMTP 経由で電子メールを送信する方法に関する指示を含むクラスがあり、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);

クラスを実際に使用して電子メールを送信する方が、はるかに単純でクリーンであることに気付きましたか? もちろん、最初にサービスを登録する作業を行う必要がありますが、それは些細なことであり、一度だけ行う必要があります。

EmailSender1 つではなく 3 つの依存関係があると想像してください。サービスを使用すると、実装コード (電子メールの送信に使用されるコード) を変更する必要がなく、サービス登録を変更するだけで済みます。

つまり、サービス層は、a) 1 つまたは複数の依存関係を持ち、b) 「グローバル」スコープで使用する必要があるクラスの中央リポジトリとして機能します。これらのサービス クラスを からフェッチすることDependency Injection Containerで、コードの冗長性が減り、広範な変更を簡単に行うことができます。

私は間違っているかもしれませんが、Symfony2 は依存性注入コンテナーを実装する最初の PHP フレームワークだと思います。そのため、多くの PHP 開発者はサービスの概念に慣れていない可能性があります。非常に強力なツールであることがわかるので、完全に理解することをお勧めします。さらに、サービスの概念は Symfony2 や PHP に限定されるものではありません。さまざまなフレームワークや言語でこの概念を利用できます。

于 2012-07-10T15:03:09.520 に答える
1

このテーマに関する Fabien の一連の記事を試してみてください: Dependency Injection

于 2012-07-10T06:16:53.010 に答える