2016-07-27 63 views
1

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

但该文件要求对每个请求和所有的依赖都装到集装箱里,我的问题是我怎么能加载,我只需要一个请求,而不是所有的依赖。

+4

您正在定义回调函数,该函数在调用*时会返回这些对象实例*。我不知道Silex,但除非有人调用这些函数,否则这些对象将不会被加载/实例化。 – deceze

回答

2

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

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

很显然,在$app['db.connection']的情况下,你的更可能会使用它的每一个请求这样或那样。但如果您在该请求中主动使用$app['post.repository'],则参数的原因$app['post.repository']只会执行其回调。

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

相关问题