2011-11-19 8 views
6

私はSymfony 2の新機能を搭載しており、servicesのような高度なトピックに移行しています。いつオブジェクトがサービスであるべきですか?Symfony2サービスの理解

たとえば、RESTサービスを呼び出すためのファサードオブジェクトがあるとします。このクラスにはユーザー名とパスワードが必要です。そのクラスをグローバルサービスとしてモデリングするのは正しいでしょうか?たとえそれがプロジェクト全体の一部でしか使われていないとしても?

# app/config/config.yml 
parameters: 
    my_proxy.username: username 
    my_proxy.password: password 

services: 
    my_proxy: 
     class:  Acme\TestBundle\MyProxy 
     arguments: [%my_proxy.username%, %my_proxy.password%] 

答えて

13

定義:

サービスは、特定のタスクを実行する任意のPHPオブジェクトの総称です。サービスは通常、データベース接続オブジェクトや電子メールメッセージを配信するオブジェクトなど、「グローバルに」使用されます。 symfony2では、サービスはしばしば設定され、サービスコンテナから取得されます。デカップリングされたサービスが多いアプリケーションは、サービス指向アーキテクチャーに従っていると言われています。

あなたの例は、サービスのための完璧な候補者だと思います。

APIクライアントが必要なすべての場所に建築コードをコピーしたくない場合。このタスクを依存性注入コンテナに委任する方が良いでしょう。

このようにすれば、メンテナンスが容易になります(構築が1か所で行われ、設定が可能)。

(同じインターフェイスを実装している限り)APIクライアントクラスを使用するコードに影響を与えることなく、簡単にAPIクライアントクラスを変更できるので、さらに柔軟になります。

私はゴールデンルールがあるとは思わない。しかし、基本的には、タスクを実装するすべてのクラスがサービスの候補になります。一方、エンティティは、データ保有者のほとんどではありません。

私はこの件に関してFabienの一連の記事を常にお勧めします:http://fabien.potencier.org/article/11/what-is-dependency-injection

1

はい、これにより設定部分が不要になります。このクラスが必要になるたびに、ユーザー名とパスワードを取得してコンストラクタに渡すことはありません。 Symfony2 glossaryから取ら

関連する問題