Symfony 服務容器 使用建造者建立服務

2021-09-13 19:35:35 字數 3282 閱讀 3444

本文首發於
在 symfony 服務容器入門 一文中,我們學習了如何通過繼承sfservicecontainer類實現乙個更加強大的自定義服務容器。這篇檔案將會進一步講解,如何通過使用 php **來設定服務配置選項供spservicecontainerbuilder建造者類建立服務。

svn 版本庫有更新。如果您已經檢出版本,可以執行更新操作。如果還沒有檢出,可從

檢出版本(譯註:不用試了,這個文章寫作年代比較久遠已經不再維護 svn 版本了)。

spservicecontainerbuilder同樣繼承自sfservicecontainer基類,它提供了設定服務配置選項介面供開發者使用。

所有「服務容器」類都繼承自sfservicecontainerinte***ce介面:

<?php

inte***ce sfservicecontainerinte***ce

服務的描述通過註冊服務定義來完成。每個服務定義都描述了乙個服務:從要使用的類、到傳遞給建構函式的引數、以及一堆其他配置屬性(請參見下文 sfservicedefinition)。

接下來刪除掉zend_mail中所有硬編碼**,並使用構建器動態重寫:

<?php

require_once 'path/to/sf/lib/sfservicecontainerautoloader.php';

sfservicecontainerautoloader::register();

$sc = new sfservicecontainerbuilder();

$sc->

register('mail.transport', 'zend_mail_transport_smtp')->

addargument('smtp.gmail.com')->

addargument(array(

'auth' => 'login',

'username' => '%mailer.username%',

'password' => '%mailer.password%',

'ssl' => 'ssl',

'port' => 465,

))->

setshared(false)

;$sc->

register('mailer', '%mailer.class%')->

addmethodcall('setdefaulttransport', array(new sfservicereference('mail.transport')))

;

通過呼叫register()方法建立乙個sfservicedefinition例項,方法接收服務名和類名兩個引數。

服務定義在內部將例項化為 sfservicedefinition 例項。也可以手動建立乙個例項,並使用服務容器 setservicedefinition() 方法直接註冊它。
定義物件支援鏈式操作,同時提供配置服務所需的方法。在上面的例子中,我們使用了以下幾個方法:

這樣乙個 sfservicereference 例項被新增到我們所需使用的服務裡中。當這個特殊的類被呼叫時將被動態的替換成所需要的服務例項。

在註冊階段實際上沒有建立服務例項,只是定義了服務的描述。這些服務只有在您真正想要使用它們時才會建立。這意味著您可以以任何順序註冊服務,而無需考慮它們之間的依賴關係。這也意味著您可以通過重新註冊具有相同名稱的服務來覆蓋現有的服務定義。同時,這種定義服務的方法也更易於測試。

這個類有諸多可用於修改建立和配置的方法:

由於 sfservicecontainerbuilder 類實現了 sfservicecontainerinte***ce 介面,所以可以像之前一樣使用容器中的方法:

<?php

$sc->addparameters(array(

'mailer.username' => 'foo',

'mailer.password' => 'bar',

'mailer.class' => 'zend_mail',

));$mailer = $sc->mailer;

sfservicecontainerbuilder 類能夠描述任何物件是如何例項化和配置的。我們已經在zend_mail例項中使用了容器,下面是另乙個相關示例:

$sc = new sfservicecontainerbuilder(array(

'storage.class' => 'sfmysqlsessionstorage',

'storage.options' => array('database' => 'session', 'db_table' => 'session'),

'user.class' => 'sfuser',

'user.default_culture' => 'en',

));$sc->register('dispatcher', 'sfeventdispatcher');

$sc->

register('storage', '%storage.class%')->

addargument('%storage.options%')

;$sc->

register('user', '%user.class%')->

addargument(new sfservicereference('dispatcher'))->

addargument(new sfservicereference('storage'))->

addargument(array('default_culture' => '%user.default_culture%'))->

;$user = $sc->user;

在這個 symfony 示例中,即使儲存物件將乙個選項陣列作為引數,我們也會傳遞乙個字串佔位符(addargument('%storage.options%'))。容器功能強大到支援傳遞乙個置為佔位符的陣列。
如果覺得本文對您有幫助,請隨手點讚加收藏,謝謝!
原文:

C set容器使用

stl的set是乙個二叉排序樹,也稱為集合,其在stl內部實現是紅黑樹,能夠將元素預設從小到大排序或者是字典序排序。如果宣告的元素型別不是基本資料型別而是自定義的類要給它乙個比較器,類似於sort的compare。include include include include using names...

C vector容器使用

一 vector容器四種遍歷方式 include include include using namespace std void print vector v bool mycmpare const int a,const int b 定義三個結構體 struct cvector2 struct ...

C set 容器使用

g set.cc std c 17 set 容器使用 set 內部是使用紅黑樹實現的,是一種平衡二叉樹,所以對其插入 查詢效率是非常高的,其時間複雜度是log2 n set是stl中一種標準關聯容器。它底層使用平衡的搜尋樹 紅黑樹實現,插入刪除操作時僅僅需要指標操作節點即可完成,不涉及到記憶體移動和...