2014-10-10 30 views
1

我目前正在測試爾康PHP一個項目,我正在尋找一種方式來自動注入自動根據已實現的接口上的某些類。PhalconPHP DI:初始化器

The Dependency Injection reference有一個例子,如果一個類實現了Phalcon\DI\InjectionAwareInterface,它會自動將DI注入到該類中。

我想要做的是類似的。如果一個類有例如Aranea\Db\DbAdapterAware,它應該自動在該類中注入DbAdapter。我要尋找類似於Zend框架2做一些事情(https://juriansluiman.nl/article/121/interface-injection-with-initializers-in-zend-servicemanager),DI期間在那裏的配置,你可以像這樣指定初始化:

'initializers' => array(    
    'logger' => function($service, $sm) { 
     if ($service instanceof LoggerAwareInterface) { 
      $logger = $sm->get('logger'); 
      $service->setLogger($logger); 
     } 
    } 
), 

如果無法自動可能在PhalconPHP,我想重寫FactoryDefault的上課並自己實施。什麼纔是注入這個邏輯的正確的地方?在get *方法中,或者在set *方法中?我假設一個方法在DI初始化期間沒有被初始化,但是在第一次調用時,所以得到*聽起來更合適?

謝謝你的建議,

的Jeroen

回答

1

依賴注入參考有一個例子,如果一個類實現Phalcon\DI\InjectionAwareInterface,它會自動注入到DI該類。

這是不完全正確的,它的意思是,DI得到(自動)注射時的服務給它實現了這個接口解決,DI並不神奇,只是因爲這個類實現一些接口出現有。

如果一個類有例如Aranea\Db\DbAdapterAware,它應該自動在該類中注入DbAdapter。

這是有點它是如何工作(不是技術上的),如果你的類繼承了Phalcon\DI\Injectable(或以同樣的方式作爲Phalcon\DI\Injectable實現InjectionAwareInterface)。在Injectable內部有一個__get魔術,如果服務存在,它會從DI返回服務。換句話說,東西只能在DI中注入,而其他類在那裏查找服務。

要注入您自己的服務,您可以將它們在您的配置中傳遞給DI或擴展DIFactoryDefault。兩者之間的區別在於FactoryDefault已經預先配置了有用的服務,但您可能並不需要這些服務。

我假設一個方法在DI初始化過程中沒有初始化,但是在第一次調用時,所以get *聽起來更合適?

是的,有一個Phalcon\DI\Service對象表示該服務在調用時,第一次(如果它是一個共享服務)或解決每一次(如果不是)解決。您通常希望共享您的所有服務,否則這通常會成爲瓶頸,例如,解決非共享的數據庫接口,其中規定每次調用它的連接...當

PS:注意,因爲它爲你想要的工作與DbAdapter你可以做幾件事情:

  1. 添加適配器吸氣劑並返回DI::getDefault()->getShared('db');
  2. 擴展Phalcon\DI\Injectable並在創建類時設置DI,以便它可以查找服務。
  3. 每次您需要適配器時,只需從第一個選項中顯示的DI中獲取即可。