2012-07-10 6 views

答えて

8

私はサービスを説明するために最善を尽くすつもりですが、Symfony2 docsは私よりも優れた仕事をしています。

コアでは、サービスは単なるクラスです。 Symfony2のDependency Injection Container(または単にContainer)に登録されると、クラスはサービスになります。この時点で、クラスはアプリケーションのサービスレイヤの一部です。

サービスは依存関係を持つことがあります(しばしばそうなりますが、必須ではありません)。サービスは、他のサービスの依存関係としてよく使用されます。あなたは電子メールを送信するために使用されるクラスを持っている

  • 、あなたはSMTPを介して電子メールを送信する方法の手順が含まれているクラスを持っているEmailSender
  • と呼ばれる、持っているSmtpTransport
  • EmailSenderと呼ばれる:私はあなたに例を挙げましょう依存関係はSmtpTransportの形である。つまり、EmailSenderがそのジョブを実行できるようにするには、SmtpTransportというインスタンスを注入する必要があります。 (EmailSenderが依存しているものの、SmtpTransportにはないことに注意してください。)

アプリでEmailSender 5内の異なる場所を使用する必要が言います。 (EmailSenderは一つだけ依存しているため)コードの多くではありませんが、あなたの代わりにSMTPを使用しての、EmailSenderはトランスポートを使用する必要があると判断したときに何が起こる

$emailSender = new EmailSender(new SmtpTransport()); 
$emailSender->send($email) 

:各スポットでは、次のようなコードを有していても良いです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に限定されるものではなく、さまざまなフレームワークや言語でこのコンセプトを活用することができます。

1

におけるサービス層について理解することができますは、件名に記事のファビアンのシリーズをお試しください。

+0

DIを理解しましたが、サービスのことを理解できませんでした – user825904

+0

同じことです。サービスはDICで指定されたクラスです – MDrollette

+0

私はこのリンクからsymfony2を学んでいますhttp://tutorial.symblog.co.uk/docs/customising-the-view-more-with-twig.html、誰でもこのサービスレイヤーが何であるか、またはこのチュートリアルでサービスレイヤーを使用する方法を教えてもらえますか – user825904

関連する問題