2016-11-22 54 views
1

我正在使用Slim Framework和PHP-DI爲我自動導入依賴關係。但是一個依賴只是一個常規數組。如果我將一個常規數組放入我的容器配置中,則所有數組都將被設置爲該數組。所以我的主要問題是:將一個常規變量添加到自動連線功能

如何注入只有一個變量,而讓容器自動連線剩下的?這可能嗎?我發現自己寫這樣的路線:

$app->get('/userConfig', function (
    Request $request, 
    Response $response, 
    Preferences $prefs, 
    UserConfig $userconfig) 
{ 
    $myArray = ['Thing1','thing2','thing3']; 
    return $userconfig->configView($request, $response, $myArray, $prefs); 
}); 

而我其他的途徑是短這樣的,因爲他們只對不同類別的依賴關係:

$app->get('/testPage', ['\Test','myTestPage']); 

我寫的所有多餘的東西只是爲了將$myArray壓入configView函數,有沒有辦法將常規的依賴注入與自動裝配結合起來?任何框架或圖書館是否都這樣做?

我剛纔寫它像這樣,如果我沒有需要一個數組:

$app->get('/userConfig', ['\UserConfig','configView']); 

或者,我可以伸入容器,並獲得陣列,但是這將讓頁面功能取決於容器,這是應該避免的。

+0

我已經添加到容器的值。但我不想從課堂內部調用容器,我想注入它們,注入容器並調用它會打敗DI的目的,並且座右銘:「告訴,別問。」。 – adjenks

回答

0

我需要使用容器的call()函數。正如你在問題中看到的那樣,configView還有一個「Preferences」參數,但是我不必傳遞它,容器爲我做了。我不知道如何將它傳遞的參數部分集合,這是多麼,如在呼叫(的第二個參數,像這樣的陣列):

$app->get('/userConfig', function (
     Request $request, 
     Response $response 
    ){ 
     $myArray = ['Thing1','thing2','thing3']; 
     return $this->call(['UserConfig', 'configView'],[$request,$response,$myArray]); 
    }); 

的關鍵部分是[$request,$response,$myArray]並且不需要所有其他參數。在我的例子中只有一個,但我的實際對象有5個,我想知道如何避免處理其他參數,這是如何...

1

你不能只用自動裝配來解決這個問題。你必須寫一個位配置的注入你的陣列到你需要的類:http://php-di.org/doc/php-definitions.html

參見此處瞭解如何建立一個配置文件,搭配修身和PHP-DI:http://php-di.org/doc/frameworks/slim.html#configuring-php-di

+0

我明白如何爲容器添加值。問題是我想向容器中添加'值',而不是'類',但問題在於你不能使用類型提示和'值',並且需要使用類型提示來使用自動裝配。 – adjenks

+0

@adjenks是的,正如我所說**,你不能解決只有自動裝配**。您需要使用配置,如果您鍵入提示「字符串」或「數組」,PHP-DI無法自動猜測您想要的「字符串」或「數組」。 –

+0

我想通了。使用call()允許我做我想做的事。 – adjenks