Laravel文档指出绑定单例的适当方法是使用App::singleton()
方法,但内部Laravel将使用bindShared()
方法(例如,在TranslationServiceProvider
中)。< / p>
我认为记录的方法是首选,但是有功能差异吗?如果没有,是否有任何理由采取两种方法(超出历史意外)?
答案 0 :(得分:8)
我一直想知道同样的事情。我不知道这背后的动机,但我可以谈一些差异。
以下是Laravel 4.2中两种方法的定义:
public function singleton($abstract, $concrete = null)
{
$this->bind($abstract, $concrete, true);
}
public function bindShared($abstract, Closure $closure)
{
$this->bind($abstract, $this->share($closure), true);
}
相似点:
bind()
。true
传递给bind()
的第三个参数,这表示这是一个共享对象。isShared($abstract)
的调用将返回true。make($abstract)
的调用将仅返回 第一个实例。的差异:
singleton()
将接受Closure
或string
。 bindShared()
只接受Closure
,而不是string
。bindShared()
,除了将对象作为共享对象绑定到IOC容器之外,还需要附加步骤将Closure
包裹在share
中}'d Closure
,可防止传递的Closure
被多次执行。乍一看,这似乎是 double 保证对象将被视为单身。我只能猜到为什么这可能是可取的。bindShared()
在框架内被调用了87次。 singleton()
被称为0次。答案 1 :(得分:7)
除了bindShared()
只接受闭包之外,它们在功能上是相同的。
因此,Laravel 5.1(PR 9009 - commit 829060f)已弃用bindShared()
,并在Laravel 5.2(PR 9037)中将其删除。
案件终于解决了:)
答案 2 :(得分:2)
bind($ abstract,$ concrete,$ shared) 添加$ abstract作为容器的键,$ concrete是在其位置实例化的具体类。主要用于为接口提供具体实现。
<强>共享($闭合)强> 给定一个闭包(仅限),使其表现得好像是共享的(实例/单例样式),然后返回它。技术上等同于App :: bind($ key,$ closure,true),但是以不同的方式进行。主要用于服务提供商,为IoC容器添加完全可解析的服务。
bindShared($ abstract,$ closure) 4.1中引入的快捷方式,适用于常见模式。基本上帮助那些想要在容器中绑定共享实例的人。例如,见下文。
单身($ abstract,$ concrete) 只需一个别名来绑定$ shared参数设置为true。主要用于为接口提供具体实现,但应该只有一个实例(数据库连接等)。“
这是来自http://alexrussell.me.uk/laravel-cheat-sheet/我认为这个链接应该是有帮助的
答案 3 :(得分:0)
我认为主要是为了向后兼容。 Singleton解释了比bindShared更好的行为。删除bindShared意味着Package开发人员重构他们的代码。