是否应该在每个请求上加载所有依赖项?

时间:2016-07-27 09:29:00

标签: php dependency-injection silex

您好我正在使用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']);
};

但是每个请求都会请求这个文件,并且所有依赖项都被加载到容器中,我的问题是如何加载我只需要一个请求而不是所有请求的依赖项。

1 个答案:

答案 0 :(得分:2)

正如@deceze在评论中所说的那样(应该让它成为答案!),你在每个请求上“加载”的是一堆函数表达式语句。您基本上可以将提供者视为“类”,其中函数声明是作为函数表达式而不是函数语句完成的。按照普通的类,函数不会运行只是你定义它们,对吗?不,你需要在他们做任何事之前给他们打电话。

分配给$app['db.connection']服务的函数表达式中的代码仅在您使用 $app['db.connection']时才会执行。否则你所做的就是定义一个包含函数的变量。

显然,在$app['db.connection']的情况下,你 很可能会以某种方式使用它。但出于参数的考虑,$app['post.repository']只有在您在该请求中主动使用$app['post.repository']时才会执行其回调。

有意义吗?如果没有,我可以进一步阐述。