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