您好我正在使用Silex创建一个PHP应用程序,我想使用依赖注入。对于依赖注入,我需要将依赖项加载到容器中。我有一个文件,其中包含加载到容器中的所有定义,称为di.php,它看起来像这样。
/**
* DI.php
*/
$app['db.connection'] = function() use($app) {
return new Connection([
'dbname' => $app['dbname'],
'dbuser' => $app['dbuser'],
'dbpass' => $app['dbpass'],
'dbhost' => $app['dbhost'],
]);
};
$app['user.repository'] = function() use($app) {
return new UserRepository($app['db.connection']);
};
$app['post.repository'] = function() use($app) {
return new PostRepository($app['db.connection']);
};
$app['index.controller'] = function() use($app) {
return new IndexController($app['user.repository']);
};
$app['post.controller'] = function() use($app) {
return new PostController($app['post.repository']);
};
但是每个请求都会请求这个文件,并且所有依赖项都被加载到容器中,我的问题是如何加载我只需要一个请求而不是所有请求的依赖项。
答案 0 :(得分:2)
正如@deceze在评论中所说的那样(应该让它成为答案!),你在每个请求上“加载”的是一堆函数表达式语句。您基本上可以将提供者视为“类”,其中函数声明是作为函数表达式而不是函数语句完成的。按照普通的类,函数不会运行只是你定义它们,对吗?不,你需要在他们做任何事之前给他们打电话。
分配给$app['db.connection']
服务的函数表达式中的代码仅在您使用 $app['db.connection']
时才会执行。否则你所做的就是定义一个包含函数的变量。
显然,在$app['db.connection']
的情况下,你 很可能会以某种方式使用它。但出于参数的考虑,$app['post.repository']
只有在您在该请求中主动使用$app['post.repository']
时才会执行其回调。
有意义吗?如果没有,我可以进一步阐述。