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

Should all dependencies be loaded on every request?

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

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

正如@deceze 在他们的评论中所说(应该把它作为一个答案!),你在每个请求中 "loading" 只是一堆函数表达式语句。您基本上可以将您的提供程序视为 "classes",其中函数声明是作为函数表达式而不是函数语句完成的。按照正常的 class,函数不会 运行 只是因为您定义了它们,对吗?不,你需要在他们做任何事情之前给他们打电话。

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

显然,在 $app['db.connection'] 的情况下,您 很可能会以某种方式在每个请求中使用它。但是为了论证 $app['post.repository'] 只有在您在该请求中主动使用 $app['post.repository'] 时才会执行其回调。

有道理吗?如果没有我可以进一步详细说明。