2012-02-08 59 views
1

在Symfony2中,服務被定義爲[重點礦山]:Symfony2服務總是需要在包中聲明嗎?

A服務是用於執行一個 特定任務的任何PHP對象的通用術語。服務通常使用「全球」,如 數據庫連接對象或傳遞電子郵件消息的對象。 在Symfony2中,服務通常是從 服務容器中配置和檢索的。據稱有一個應用程序具有許多分離的服務,它們遵循面向服務的體系結構。

以「全局」爲關鍵詞,我所看到的關於如何定義服務的所有示例都在現有捆綁包中聲明瞭服務?下面是從MartinSikora.com

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

    class MyService { 

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

    } 
?> 

一個例子吧,他使用它的Hello控制器內:

<?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 

     /* 
     ... 
     */ 
    } 
} 
?> 

通知他的榜樣,服務是如何宣佈HelloBundle束內標有「服務」的文件夾。如果「服務」文件夾在任何特定包之外存儲了一個或多個更高級別的文件夾,那麼這樣做會不會更好?因爲服務旨在用於整個應用程序?

  • 這裏最好的做法是什麼?
  • 此服務僅適用於HelloBundle包內的控制器嗎?
  • 爲什麼通常這樣做?

回答

10

簡短的回答
否,不都需要在包內定義的服務。實際的服務類可能會也可能不會生活在一個包中 - 它們可能位於供應商庫文件夾(或其他任何地方)中。而服務定義雖然通常在捆綁的Resources\config\services.yml中定義,但也可以在app/config.ymlservices密鑰下定義。

服務只是一個已經註冊到Symfony的依賴注入容器中的類。班級本身可以在任何地方居住。

長答案
瞭解Symfony2中bundles的用途很重要。你的項目的大部分(主要例外是第三方庫)由捆綁組成。有些人喜歡把所有東西放在一個巨大的包中,但我更喜歡將它們用作特定功能塊的容器(即:用戶管理,博客文章管理,資產管理)。

因爲包應該代表一個功能,在捆綁中定義一些服務是有意義的。例如,在BlogPostBundle中定義BlogPostEntityService類是很自然的。現在,僅僅因爲服務包含在一個包中,並不會使其成爲全局性的東西。如果我將我的服務註冊爲blog_bundle.blog_post_entity_service,我仍然可以從任何其他包中訪問它。

在Martin的例子中,MyService是一個模糊的例子 - 它不是像BlogPostEntityService那樣特殊。但是,您可能會創建實用程序服務(即ArrayUtilService),在這種情況下,您可能需要創建一個UtilBundle並將服務存儲在那裏。

這裏最好的做法是什麼?

沒有確定的答案 - 這取決於你決定在哪裏存儲服務類。問問你自己服務是否直接處理你的包所代表的功能 - 如果是這樣,它可能屬於這個包。如果您打算共享或重新使用您的軟件包,這也很有意義。

此服務僅適用於HelloBundle 包內的控制器嗎?

不可以。您可以從任何控制器(或任何container意識到的類)中調用該服務。您也可以將MyService注入任何其他服務。