是否应该在每个请求上加载所有依赖项?
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']
时才会执行其回调。
有道理吗?如果没有我可以进一步详细说明。
您好,我正在使用 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']
时才会执行其回调。
有道理吗?如果没有我可以进一步详细说明。