Laravel IoC与单例模式

Laravel IoC与单例模式,laravel,laravel-4,Laravel,Laravel 4,我试图通过创建一个单例对象来使用Laravel IoC。我遵循教程中的模式,如下所示。我已将一条日志消息放入对象(本例中为Foobar)构造函数中,每次我在浏览器中刷新页面时都可以看到正在创建该对象。单例模式对Laravels IoC意味着什么?我知道它是整个应用程序的共享对象,但它显然是在每次App:make(…)请求时创建的。有人能解释一下吗。我想我会使用singleton模式来维护共享MongoDB连接 App::singleton('foo', function() { retu

我试图通过创建一个单例对象来使用Laravel IoC。我遵循教程中的模式,如下所示。我已将一条日志消息放入对象(本例中为Foobar)构造函数中,每次我在浏览器中刷新页面时都可以看到正在创建该对象。单例模式对Laravels IoC意味着什么?我知道它是整个应用程序的共享对象,但它显然是在每次App:make(…)请求时创建的。有人能解释一下吗。我想我会使用singleton模式来维护共享MongoDB连接

App::singleton('foo', function()
{
    return new FooBar;
});

它意味着在整个应用程序实例中多次使用。每次刷新页面时,它都是应用程序的一个新实例

有关更多信息和实际用途,请查看此链接:


它是为L3编写的,但同样适用于L4。

Laravel Doc

有时,您可能希望将某些东西绑定到 应该只解析一次,并且应该返回相同的实例 在随后调用容器时:

这就是如何绑定
singleton
对象的方法,您做得很对

App::singleton('foo', function()
{
    return new FooBar;
});
但是,问题是,您以错误的方式考虑了
请求
响应
的整个过程。你提到过,

每次在中刷新页面时,我都可以看到正在创建该对象 浏览器

这是
HTTP
请求的正常行为,因为每次刷新页面都意味着每次发送新请求,每次应用程序启动并处理发送的请求,最后,一旦应用程序在浏览器中发送响应,它的工作就完成了,什么都不保留(会话、cookie是持久的,在本例中是不同的)

现在,有人说,
在后续调用中应该返回相同的实例
,在这种情况下,后续调用意味着,如果调用
App::make(…)
在应用程序的单个生命周期内,对同一请求多次调用,则不会每次都创建新实例。例如,如果您调用两次,类似于这样的情况

App::before(function($request)
{
    App::singleton('myApp', function(){ ... });
});
在同一个请求中,在控制器中,您首先调用

class HomeController {
    public function showWelcome()
    {
        App::make('myApp'); // new instance will be returned
        // ...
    }
}
再次在第二次过滤后调用它

App::after(function($request, $response)
{
    App::make('myApp'); // Application will check for an instance and if found, it'll  be returned
});

在本例中,两个调用都发生在同一个请求中,由于是单实例,因此容器在第一次调用时只生成一个实例,并保留该实例供以后使用,并在后续调用时返回同一实例。

感谢您的详细解释。我来自Java world,IoC容器和单实例都有稍微有点不同的含义。现在我很清楚了。但我的应用程序中的许多请求的db连接共享模式是什么。例如,当我使用MongoDb时,希望与服务器建立一个池连接,在请求之间共享,而不是为每个请求创建一个新的连接…?欢迎:-)试试看。投票支持@WereWolf TheAlpha的精彩解释,非常感谢