核心:为什么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现在有三种可供选择,一种接口和两种实现。


在睡了一晚之后,在代码中进一步挖掘(可能尚未完全通过代码验证),其最可能的原因是:

“走样”

以各种方式/方法使用:

  • 它可以表示别名Facade(如FacadeClass的URL)。 这是完全不同的(!?)
  • 它可能意味着将所谓的“抽象”(术语/字符串)(如“url”)映射到一个“别名”,然后以laravel术语是一个类或(!)接口。 别名(如上面的方法)不需要直接与绑定做任何事情。
  • “捆绑”

    Laravel Container在其Container类中有两个名为$aliases$bindings.属性$bindings. 绑定将“抽象”与具体类的真实约束联系在一起! 因此,每个别名(如上所述)还需要(!)与具体类的“抽象”具有相应的绑定(!)以便立即执行。

    结论

    实际上,如上所述,关键字/抽象“url”有三个别名(具体类和接口)。 但他们与instanciating进程无关。 为了别名的工作,另外还需要一个真正的绑定!

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

  • 如果你用任何别名调用Container::make() ,laravel会尝试将它们解析为“abstract”(这里是“url”)。
  • 然后在第二步,这个抽象的“url”然后试图解决绑定(这是完全不同的)。
  • 如果未找到别名的绑定,则会引发错误。
  • 所以你可以有任意数量的别名,但只有一个绑定,你必须有单一的绑定(另外!)。

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

    链接地址: http://www.djcxy.com/p/87997.html

    上一篇: Core: Why does Laravel store Aliases multiple times?

    下一篇: Two foreign keys as primary key