Tim*_*idt 7 php ioc-container laravel
Laravel在Application.php的核心注册了很多默认实现,如下所示:
'url' => ['Illuminate\Routing\UrlGenerator', 'Illuminate\Contracts\Routing\UrlGenerator'],
Run Code Online (Sandbox Code Playgroud)
这将有效地将下面的方法称为两次
public function alias($abstract, $alias)
{
$this->aliases[$alias] = $abstract;
}
Run Code Online (Sandbox Code Playgroud)
导致以下值Container->aliases:
"Illuminate\Routing\UrlGenerator" => "url"
"Illuminate\Contracts\Routing\UrlGenerator" => "url"
Run Code Online (Sandbox Code Playgroud)
如果我稍后调用:
$this->app->alias('url', 'App\Util\Portal\UrlGenerator');
它甚至将它存储在Container的别名数组中:
"App\Util\Portal\UrlGenerator" => "url"
Run Code Online (Sandbox Code Playgroud)
我的问题:
为什么laravel将它们全部存储两到三个而不是覆盖它们?存储具体类应该足够了.但是为什么laravel会将它们全部存储起来?当我现在使用App :: make('url')时,laravel如何判断哪一个要解决?Laravel现在有三个可供选择,一个接口和两个实现.
在它上面睡一个晚上并在代码中挖掘更多(尚未在代码中进行100%验证)之后最有可能:
"走样"
用于各种方式/方法:
"捆绑"
Laravel Container在其Container类中有两个属性,名称$aliases和$bindings.Bindings将"抽象"的实际绑定保存到具体的类中以进行实例化!因此,每个别名(如上所述)也需要(!)从"抽象"具有相应的绑定(!),以便实例化具体类.
结论
实际上,如上所述,键/抽象"url"存在三个(具体类和接口)别名.但它们与实例化过程无关.对于别名的工作,additinally也需要真正的绑定!
因此实际上"容器别名"允许您访问与其他类或接口名称的现有绑定.
Container::make()使用任何别名调用,laravel将尝试将它们解析为"abstract"(此处为"url").因此,您可以拥有任意数量的别名但只有一个绑定,您必须拥有该单个绑定(另外!).
(有趣的是,如果将别名映射到与绑定相同的类,它似乎以递归错误结束.但这也可能是xdebug问题).