2016-11-22 59 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