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

2023-11-26

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

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

我的问题:

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


在睡了一晚并深入研究代码之后(尚未在代码中 100% 验证),最有可能的是:

“别名”

以各种方式/方法使用:

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

“捆绑”

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

结论

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

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

  1. 如果你打电话Container::make()对于任何别名,laravel 都会尝试将它们解析为“抽象”(此处为“url”)。
  2. 然后在第二步中,尝试根据绑定解析这个抽象“url”(这是完全不同的东西)。
  3. 如果未找到别名的绑定,则会引发错误。

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

(有趣的是,如果将别名映射到与绑定相同的类,则似乎会导致递归错误。但这也可能是一个 xdebug 问题)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel-Core:为什么 Laravel 多次存储别名? 的相关文章

  • 内连接 3 个表

    我正在使用 PHP 和 PDO 我需要重新收集连接 3 个表的信息 photos albums 相册照片 该表具有以下结构 photos photo id int path varchar nick varchar date timesta
  • Homestead 无法远程访问第二个站点

    我的一个站点设置正常 但第二个站点无法远程访问 My YAML ip 192 168 10 10 memory 2048 cpus 1 provider virtualbox authorize ssh id rsa pub keys ss
  • 如何在没有 session_destroy 的情况下销毁 Zend_Session_Namespace

    我使用以下方法在临时会话中存储一些值 job new Zend Session Namespace application 我如何只销毁会话应用无需清除所有会话 要从会话中删除值 请对对象属性使用 PHP 的 unset 函数 假设 job
  • 如何使用 php DOM 获取 内的值?

    我如何使用 php DOM 获取 内的值 这是我的 xml 中的一些代码
  • DataTables 第 2 页的分页未调用放大弹出窗口

    所以我有这个启用分页的数据表 我编码了一种方式 以便用户可以编辑表的行 当用户调用它在放大弹出窗口中打开的编辑页面时 它在第 1 页 从第 2 页起都运行良好 DataTable 及其前面停止调用 Magnific Popup 我只是不明白
  • PHP 中的静态类初始值设定项

    我有一个带有一些静态函数的辅助类 类中的所有函数都需要一个 重 初始化函数来运行一次 就好像它是一个构造函数 有实现这一目标的良好实践吗 我唯一想到的就是打电话init函数 如果它已经运行过一次 使用静态 initialized变种 问题是
  • 在另一个文件中扩展类的正确方法是什么?

    这就是我在 foo php 中的内容 class Foo public foo NULL public foo2 NULL public function setFoo foo foo2 this gt foo foo this gt fo
  • 在 mysqli 准备好的语句程序风格中获取最后插入的 id 的正确方法是什么?

    我正在使用 mysqli 准备好的语句在表中插入记录 如下所示 link mysqli connect localhost my user my password world check connection if link printf
  • Zend RegEx Validator 的自定义有意义的错误消息

    我正在验证表单中的文本字段 如下所示 name new Zend Form Element Text name name gt setLabel First Name gt setRequired true gt addFilter new
  • 优雅地退出 Laravel 作用域

    我有一个范围 它根据用户角色以限制方式起作用 您可以将一组规则转发到限制数据库最终输出的范围 一个非常简化的角色限制示例 first name foo 只会返回其记录first name开始于foo 这实际上意味着我已禁止具有该角色的用户查
  • 在 PHP 中将整数转换为十六进制值

    如何将PHP中第一类中的数字转换为第二类中的数字 是否有内置函数来转换数字 也是我的标题 将整数转换为十六进制值 甚至正确 class Permission const READ 1 const UPDATE 2 const DELETE
  • 当路由不存在时重定向 laravel 4

    我正在使用 laravel 4 当我的项目处于生产模式时 我得到 抱歉 找不到您要查找的页面 当我到达一条不存在的路线时 当我 grep 我的代码时 它在两个地方找到 vendor symfony debug Symfony Compone
  • 将 Cloudinary 与 spatie/media-library Laravel 包一起使用

    有人使用 Laravel 包 spatie media library 和 Cloudinary 吗 我认为用 Flysystem 来实现它是微不足道的 我实际上使用 Cloudinary 作为带有 silvanite nova field
  • 细胞的 fpdf 对齐

    我正在尝试使用生成 PDFfpdf我有一个小问题 我需要有 2 个单元格 如下所示 Address Line 1 Version Address Line 2 1 0 City 06 05 2011 我尝试过使用MultiCell 但没有运
  • 从检查元素隐藏 ''

    我有这个 HTML 和 PHP 联系表
  • 自定义 WordPress 画廊 html 布局

    当使用默认媒体上传器在 WordPress 中创建图像库时 WordPress 将图像包装在一堆 HTML 标记中 如何在生成之前覆盖它 以便我可以输出所需的标记并更改创建图库布局的方式 目前 WordPress 生成的代码如下 div d
  • 将 echo 和 print 合并到一个语句中

    echo 1 print 2 3 返回 214 脚本如何以 14 结尾 当你这样做时 echo 1 print 2 3 PHP 会做 demo http codepad viper 7 com OfrNrs line op fetch ex
  • PhpStorm背景错误

    PhpStorm更新后 Blade模板中 script标签突出显示 在设置中 一切正常 为什么要突出显示这一点 检查语言注入中是否有非 内置 行 禁用您不认识的项目
  • 使用 Webmin 设置 cron 作业

    我正在尝试使用 Webmin 设置一个 Cron 作业每 5 分钟运行一次 它需要定位 php 文件并运行该文件中的 php 脚本 当我在 命令 字段中输入文件路径时 它不起作用 我只是想知道我做错了什么 以及我需要 Cron 作业运行的文
  • 使用 Swift 邮件程序发送邮件时出现错误 501

随机推荐

  • 使用 yyyy-MM-dd hh:mm:ss 格式解析的日期出现意外差异

    我运行下面的java代码来获取时差 import java text SimpleDateFormat import java util Calendar import java util Date import java util Tim
  • 如何找到命名空间及其成员的所有用法?

    我正在尝试搜索一个大型解决方案以查找给定名称空间或其成员的任何用法 例如 System IO Resharper 的 查找用法 允许我查找以下内容的参考System IO 但仅在明确使用时 如果文件声明using System IO 然后使
  • 如何限制递归子目录搜索的深度

    我有一个功能 当前可以抓取所有文件夹和子文件夹来检查我正在构建的小工具的 ACL 但我正在绞尽脑汁试图弄清楚如何限制它可以达到的深度 例如 您有一个 4 层深度的文件夹 但我希望只能获取其中 3 层的 ACL 目前我已将其编码如下 priv
  • Cakephp 使用 htaccess 和 htpasswd 进行密码保护 - 如何?

    在 Cakephp 中使用 htaccess 开发期间如何使用密码保护我的网站 我必须更改哪个 htaccess 文件 我必须在 htaccess 中写什么 我应该把 htpasswd 放在哪里 我在谷歌上搜索过 但找不到任何有用的东西 我
  • 为什么 Array.prototype 返回一个空数组?

    这可能是一个愚蠢的问题 但是为什么当我控制台时我得到一个空数组Array prototype 我期待着推送和弹出方法 大多数原型的内置方法都不是可枚举的 因此如果您使用它们将不会显示for in 你不应该在数组上这样做 但这只是一个例子 由
  • 请解释一下区别

    我有一个关于二维数组的程序 基地址是8678 include
  • 如何通过 php 中的网络服务发送/获取文件

    这可能吗 发送文件的正确方法是什么 thanks 如果您希望网络服务上传 下载文件 我不知道 无论如何你可以使用curl http fr php net curl 从其他网络服务器上传 下载文件 要从用户处获取上传到 Web 服务的某些文件
  • JavaScript 音频的未来?

    我正在教孩子们如何向他们的 JavaScript 游戏和网页添加音频 我了解 HTML5 音频 API 现在刚刚了解各种浏览器的问题 令人惊讶的是 IE 根本不支持 WAV 等 不过 显然有一个新的网络音频标准我不知道 Chrome 完全支
  • 在 PHP 中显示两个日期之间的所有周数[重复]

    这个问题在这里已经有答案了 任何人都可以告诉如何在 PHP 中显示两个日期之间涵盖的所有周数 日期可能是不同的年份 如果我使用开始日期为 2011 09 16 结束日期为 2011 09 21 它将显示第 37 周和第 38 周 你可以使用
  • 从 Javascript 端调用 Qt 函数 (QWebView)

    我有一个 Qt 项目 可以将任何 HTML 页面加载到 Web 视图中 我有以下代码main cpp file include mainwindow h include
  • 如何在 iText 生成的 PDF 中添加图像到我的标题?

    我正在使用 iText 生成 PDF 我创建了一个自定义 PdfPageEventHelper 来向每个页面添加页眉 和页脚 我的问题是我不知道如何添加图像 因此它显示在 标题框 中 我只知道如何将图像添加到文档内容本身 如果有意义的话 这
  • 如何从 URL 下载文件并将其保存在 Rails 中?

    我有一个要保存在本地的图像的 URL 以便我可以使用 Paperclip 为我的应用程序生成缩略图 下载和保存图像的最佳方式是什么 我研究了 ruby 文件处理 但没有遇到任何问题 尝试这个 require open uri open im
  • C++ - 在派生类上使用的 typeid() 不返回正确的类型

    也许我误解了继承在这里的工作原理 但这是我的问题 我有一个 Option 类 以及一个从它派生的 RoomOption 类 我有另一个 Room 类 它包含一个shared ptrs 向量 在 main 中 我向该向量添加了 RoomOpt
  • “Ultra Find”的 Visual Studio 扩展发生了什么?

    Ultra Find 的 Visual Studio 扩展发生了什么 我在这个网站和互联网上看到了关于这个据称很棒的扩展的参考资料 这里有几个链接 http blog arainia com 2010 08 ultra find getti
  • 如何使用 Google Apps 脚本将公式添加到 Google 表格?

    如何添加如下公式 SUM A1 A17 使用 Google Apps Script for Google Sheets 访问一系列字段 这是使用以下方法完成的设置公式对于选定的单元格 下面是如何执行此操作的示例 var ss Spreads
  • 获取 ReferenceError:找不到变量:角度

    我对 yeoman 及其使用的所有工具都很陌生 我在 yeoman 中创建了一个测试项目 并尝试在 jasmine 中运行测试规范 我已经使用cmd安装了jasmine插件 npm 安装 grunt contrib jasmine save
  • 使用WeifenLuo DockPanel套件

    我刚刚下载了罗维芬 Dock Panel Suite 并尝试使用它 但我找不到有关如何使用它的具体文档 我已经解决了一些问题 终于有了一些开始的东西 这是我所做的 我创建了一个 ToolboxWindow 类 如下所示 Public Cla
  • C/C++ 和 Python 之间共享内存

    有没有办法共享内存以在 C C 和 python 之间共享 openCV 图像 C 中的 MAT 和 python 中的 numpy 图像 不需要多平台 我在linux中做 我认为在mmap或类似的想法之间共享 我有两个正在运行的进程 一个
  • 为什么检查 isinstance(something, Mapping) 这么慢?

    我最近比较了性能collections Counter to sorted用于比较检查 如果某些迭代包含相同数量的相同元素 而大迭代的性能Counter一般好于sorted对于短的可迭代对象来说要慢得多 Using line profile
  • Laravel-Core:为什么 Laravel 多次存储别名?

    Laravel 在 Application php 的核心中注册了很多默认实现 如下所示 url gt Illuminate Routing UrlGenerator Illuminate Contracts Routing UrlGene