Laravel IoC和单例模式

时间:2013-06-27 19:29:54

标签: laravel laravel-4

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

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

2 个答案:

答案 0 :(得分:28)

Laravel Doc

中所说的内容
  

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

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

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

但问题是,您正在以错误的方式思考requestresponse的整个过程。你提到了,

  

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

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

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

App::before(function($request)
{
    App::singleton('myApp', function(){ ... });
});

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

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

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

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

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

答案 1 :(得分:-1)

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

查看此信息以获取更多信息和实际用途:http://codehappy.daylerees.com/ioc-container

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