核心:为什么Laravel多次存储别名?
Laravel在Application.php的核心中注册了许多像这样的默认实现:
'url' => ['IlluminateRoutingUrlGenerator', 'IlluminateContractsRoutingUrlGenerator'],
以下将有效地称为下面的方法两次
public function alias($abstract, $alias)
{
$this->aliases[$alias] = $abstract;
}
导致Container->aliases
中出现以下值:
"IlluminateRoutingUrlGenerator" => "url"
"IlluminateContractsRoutingUrlGenerator" => "url"
如果我稍后调用: $this->app->alias('url', 'AppUtilPortalUrlGenerator');
它甚至将它存储在容器im中的第三个时间别名数组:
"AppUtilPortalUrlGenerator" => "url"
我的问题:
为什么拉拉维尔将它们全部存储了两三次,而不是覆盖它们? 存储具体的类应该足够了。 但为什么拉拉维尔将他们全部储存起来呢? 当我现在使用App :: make('url')时,laravel如何告诉,哪一个可以解决? Laravel现在有三种可供选择,一种接口和两种实现。
在睡了一晚之后,在代码中进一步挖掘(可能尚未完全通过代码验证),其最可能的原因是:
“走样”
以各种方式/方法使用:
“捆绑”
Laravel Container在其Container类中有两个名为$aliases
和$bindings.
属性$bindings.
绑定将“抽象”与具体类的真实约束联系在一起! 因此,每个别名(如上所述)还需要(!)与具体类的“抽象”具有相应的绑定(!)以便立即执行。
结论
实际上,如上所述,关键字/抽象“url”有三个别名(具体类和接口)。 但他们与instanciating进程无关。 为了别名的工作,另外还需要一个真正的绑定!
所以实际上,“容器别名”允许您访问与其他类别或接口名称的现有绑定。
Container::make()
,laravel会尝试将它们解析为“abstract”(这里是“url”)。 所以你可以有任意数量的别名,但只有一个绑定,你必须有单一的绑定(另外!)。
(有趣的是,如果将别名映射到与绑定相同的类,它似乎以递归错误结束,但这也可能是xdebug问题)。
链接地址: http://www.djcxy.com/p/87997.html