【问题标题】:Laravel-Core: Why does Laravel store Aliases multiple times?Laravel-Core:为什么 Laravel 会多次存储别名?
【发布时间】:2015-12-18 23:12:54
【问题描述】:

Laravel 在 Application.php 的核心中确实注册了很多这样的默认实现:

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

这将在 effekt 中调用下面的方法两次

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'); 它甚至第三次将其存储在别名数组中的容器中:

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

我的问题:

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

【问题讨论】:

    标签: php laravel ioc-container


    【解决方案1】:

    在它睡了一晚并在代码中挖掘更多内容(尚未在代码中 100% 验证)之后,最有可能是这样:

    “别名”

    以各种方式/方法使用:

    1. 它可以表示为 Facade 取别名(如 FacadeClass 的 URL)。这是完全不同的东西(!?)
    2. 这可能意味着将一个所谓的“抽象”(术语/字符串)如“url”映射到一个“别名”,在 laravel 术语中它是一个类或(!)接口。 别名(就像上面的方法一样)不需要直接对绑定做任何事情。

    “绑定”

    Laravel Container 在其 Container 类中有两个属性,名为 $aliases$bindings. Bindings 将“抽象”真正绑定到具体类以进行实例化! 因此,每个别名(如上所述)还需要(!)从要实例化的“抽象”具体类中具有相应的绑定(!)。

    结论

    实际上如上所述,键/抽象“url”有 thre 别名(具体类和接口)。但他们有 与实例化过程无关。为了使别名在那里工作,还需要一个真正的绑定!

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

    1. 如果您使用任何别名调用Container::make(),laravel 将尝试将它们解析为“抽象”(此处为“url”)。
    2. 然后在第二步中,尝试解析这个抽象的“url”与绑定(这是完全不同的东西)。
    3. 如果没有为别名找到绑定,则会引发错误。

    因此,您可以拥有任意数量的别名,但只有一个绑定,并且您必须拥有一个绑定(另外!)。

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

    【讨论】:

    • 我想了很多天...刚看到这个帖子。非常感谢,你太棒了!
    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多