将一个常规变量添加到自动连线函数

时间:2016-11-22 22:30:21

标签: php url-routing autowired php-di

我使用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']);

或者,我可以进入容器并获取数组,但这会使页面函数依赖于容器,这是应该避免的。

2 个答案:

答案 0 :(得分:1)

您无法仅通过自动装配解决此问题。您必须编写一些配置来将数组注入到您需要的类中:http://php-di.org/doc/php-definitions.html

另请参阅此处以了解如何使用Slim和PHP-DI设置配置文件:http://php-di.org/doc/frameworks/slim.html#configuring-php-di

答案 1 :(得分:0)

我需要使用容器的call()函数。正如你在问题中看到的那样,还有一个"偏好" configView的参数,但我不必传递它,容器为我做了这个。我没有理解如何传递部分参数集,这就是如何,作为call()的第二个参数中的数组如此:

$cars = [ 'all' =>
            [
                'brand' => 'Volvo',
                'X'     => 22,
                'Y'     => 28
            ],
            [
                'brand' => 'BMW',
                'X'     => 15,
                'Y'     => 13
            ]
        ];

foreach($cars['all'] as $car){
    if($car['brand'] == 'Volvo') {
        unset($car['brand']); // unset Volvo
    }
}

关键部分是$app->get('/userConfig', function ( Request $request, Response $response ){ $myArray = ['Thing1','thing2','thing3']; return $this->call(['UserConfig', 'configView'],[$request,$response,$myArray]); }); ,不需要其他参数。在我的例子中只有一个,但我的实际对象还有5个,我想知道如何避免处理其他参数,这就是......