Laravel IoC和单例模式

Dav*_*rko 6 laravel laravel-4

我试图通过创建一个单例对象来使用Laravel IoC.我正在按照以下教程中的模式进行操作.我已经将一条Log消息放入对象(本例中为Foobar)构造函数中,我可以看到每次在浏览器中刷新页面时都会创建该对象.单例模式对于Laravels IoC意味着什么?我理解它是整个应用程序的共享对象,但它显然是每次App都请求时创建的:make(...)有人可以解释一下.我以为我会使用单例模式来维护共享的MongoDB连接.

App::singleton('foo', function()
{
    return new FooBar;
});
Run Code Online (Sandbox Code Playgroud)

The*_*pha 29

说了什么 Laravel Doc

有时,您可能希望将某些内容绑定到仅应解析一次的容器中,并且应在后续调用容器时返回相同的实例:

这是绑定singleton对象的方法,你做对了

App::singleton('foo', function()
{
    return new FooBar;
});
Run Code Online (Sandbox Code Playgroud)

但是,问题是,你所想的全过程request,并response以错误的方式.你提到过,

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

嗯,这是HTTP请求的正常行为,因为每次刷新页面都意味着每次发送新请求时以及每次应用程序启动并处理您发送的请求时,最后,一旦应用程序发送响应在你的浏览器中,它的工作已经完成,在服务器中没有任何东西(会话,cookie是持久的,在这种情况下是不同的).

现在,有人说the same instance should be returned on subsequent calls,在这种情况下,后续调用意味着,如果您App::make(...)在同一请求上多次调用,则在应用程序的单个生命周期中,每次都不会创建新实例.例如,如果你打两次,就像这样

App::before(function($request)
{
    App::singleton('myApp', function(){ ... });
});
Run Code Online (Sandbox Code Playgroud)

在同一个请求中,在您的控制器中,您首先会打电话

class HomeController {
    public function showWelcome()
    {
        App::make('myApp'); // new instance will be returned
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

再次,你after第二次在过滤器中调用它

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

在这种情况下,两个调用都发生在同一个请求中,并且由于是单例,容器在第一次调用时只生成一个实例,并保留后使用的实例,并在每次后续调用时返回相同的实例.

  • 谢谢你这么详细的解释.我来自Java世界,其中IoC容器和单例具有略微不同的含义.现在对我来说很清楚.但是,对于我的应用程序中的许多请求,例如数据库连接共享的模式是什么.例如,当我使用MongoDb并希望与请求之间共享的服务器有一个池连接,而不是为每个请求创建一个新连接...? (2认同)
  • @ WereWolf-TheAlpha给出了很好的解释,非常感谢 (2认同)