Laravel-Core:为什么Laravel多次存储别名?

时间:2015-09-22 05:27:40

标签: php laravel ioc-container

Laravel在Application.php的核心注册了许多默认实现,如下所示:

'url' => ['Illuminate\Routing\UrlGenerator', 'Illuminate\Contracts\Routing\UrlGenerator'],

这将有效地将下面的方法称为两次

public function alias($abstract, $alias)
    {
        $this->aliases[$alias] = $abstract;
    }

Container->aliases中生成以下值:

"Illuminate\Routing\UrlGenerator" => "url"
"Illuminate\Contracts\Routing\UrlGenerator" => "url"

如果我稍后打电话: $this->app->alias('url', 'App\Util\Portal\UrlGenerator'); 它甚至将它存储在Container的别名数组中的第三个时间:

"App\Util\Portal\UrlGenerator" => "url" 

我的问题:

为什么laravel会将它们全部存储两到三个并且不会覆盖它们?存储具体类应该足够了。 但是为什么laravel会将它们全部存储起来?当我现在使用App :: make('url')时,laravel如何判断哪一个要解决? Laravel现在有三个可供选择,一个接口和两个实现。

1 个答案:

答案 0 :(得分:5)

在它上面睡一个晚上并在代码中挖掘更多内容(尚未在代码中进行100%验证),最有可能的是:

<强> “别名”

以各种方式/方法使用:

  1. 它可以表示Facade的别名(如FacadeClass的URL)。哪个是完全不同的(!?)
  2. 它可以意味着将所谓的“抽象”(术语/字符串)(如“url”)映射到“别名”,然后在laravel术语中将其作为类或(!)接口。 别名(如上所述方法)并不直接对绑定做任何事情。
  3. <强> “绑定”

    Laravel Container在其Container类中有两个属性,名为$aliases$bindings. Bindings将“抽象”的实际绑定保存到具体的类中以实现! 因此,每个别名(如上所述)也需要(!)从“抽象”具有相应的绑定(!),以便实现具体的类。

    <强>结论

    实际上,如上所述,键/抽象“url”存在三个(具体类和接口)别名。但他们有 与实例化过程无关。对于别名的工作,additinally也需要真正的绑定!

    因此实际上“容器别名”允许您访问与其他类或接口名称的现有绑定。

    1. 如果您使用任何别名调用Container::make(),laravel将尝试将其解析为“abstract”(此处为“url”)。
    2. 然后在第二步中,这个抽象的“url”然后尝试解决绑定(这是完全不同的东西)。
    3. 如果没有找到别名的绑定,则会引发错误。
    4. 所以你可以拥有任意数量的别名但只有一个绑定,你必须拥有那个单一的绑定(另外!)。

      (有趣的是,如果将别名映射到与绑定相同的类,它似乎以递归错误结束。但这也可能是 xdebug问题)。