我试图通过创建一个单例对象来使用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)
在这种情况下,两个调用都发生在同一个请求中,并且由于是单例,容器在第一次调用时只生成一个实例,并保留后使用的实例,并在每次后续调用时返回相同的实例.
| 归档时间: |
|
| 查看次数: |
10025 次 |
| 最近记录: |