2012-02-08 8 views
1

、サービスは[重点鉱山]のように定義される:Symfony2サービスは常にバンドルで宣言する必要がありますか? Symfony2ので

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

「グローバルに」をキーワードとすると、サービスを定義する方法の例はすべて、既存のバンドル内で宣言されていますか?彼の例のサービスは、「サービス」というフォルダにHelloBundleバンドルの内部で宣言されているか

<?php 
// Bundle/HelloBundle/Controller/HelloController.php 
namespace Bundle\HelloBundle\Controller; 

class HelloController extends Controller { 

    public function indexAction() { 
     $number = $this->get('my_service')->sum(12, 37); 
     // this returns 49 

     /* 
     ... 
     */ 
    } 
} 
?> 

注意:ここで彼はその後、こんにちはコントローラ内からそれを使用していますMartinSikora.com

<?php 
    // Bundle/HelloBundle/Services/MyService.php 
    namespace Bundle\HelloBundle\Services; 

    class MyService { 

     public function sum($n1, $n2) { 
      return $n1 + $n2; 
     } 

    } 
?> 

からの例です。サービスがアプリケーション全体で使用されるため、特定のバンドルの外に1つ以上のレベルの「サービス」フォルダが格納されている方が良いでしょうか?

  • ここでベストプラクティスは何ですか?
  • サービスはHelloBundle Bundle内のコントローラでのみ利用できますか?
  • なぜこのように通常行われますか?

答えて

10

短い答え
いいえ、サービスがバンドル内で定義する必要はありません。実際のサービスクラスは、バンドル内に存在する場合もあれば、存在しない場合もあります。ベンダーライブラリフォルダ(またはその他の場所)に存在する場合があります。サービス定義は、バンドルResources\config\services.yml内で一般的に定義されていますが、app/config.ymlにはservicesというキーで定義することもできます。

サービスは、単にSymfonyの依存性注入コンテナに登録されたクラスです。クラス自体はどこにでも生きることができます。

長い答え
それはSymfony2の中のバンドルの目的を理解することが重要です。主なプロジェクト(第三者図書館を除く)は、バンドルで構成されています。 1つの巨大なバンドルにすべてを入れることを好む人もいますが、特定の機能(つまり、ユーザー管理、ブログ投稿管理、資産管理)のコンテナとして使用することを好みます。

バンドルは、バンドル内にいくつかのサービスを定義することは理にかなっています。たとえば、BlogPostBundleBlogPostEntityServiceクラスを定義するのは当然です。さて、サービスがバンドル内に含まれているからといって、グローバル化されていないからです。サービスをblog_bundle.blog_post_entity_serviceとして登録しても、他のバンドルからアクセスできます。

マーティンの例では、MyServiceはあいまいな例です。具体的にはBlogPostEntityServiceのようなものではありません。ただし、ユーティリティサービス(ArrayUtilService)を作成する可能性があります。その場合は、UtilBundleを作成してそこにサービスを格納することをお勧めします。

ここでベストプラクティスは何ですか?

サービスクラスをどこに保存するかは決定次第です。あなたのバンドルが表す機能をサービスが直接扱うかどうか自問してください。もしそうなら、それはおそらくバンドルに属しています。バンドルの共有や再利用を計画している場合は、これも意味があります。

サービスは、HelloBundle バンドル内のコントローラでのみ利用できますか?

いいえあなたは任意のコントローラ(または任意のcontainer意識クラス)の中からサービスを呼び出すことができます。他のサービスにMyServiceを注入することもできます。

関連する問題