我还在学习PHP,我想我不是母语人士并不难理解。
这时,在阅读了大量文档后,我跳入了深水区,所以我打开了Laravel源文件,然后一个又一个文件,试图更好地理解MVC的整个实现如何包括路由,中间件组合成一段高级代码。
我看过很多以前从来不知道的术语,但有些很容易理解,而术语"已解决"和"正在解决"则让我有点头疼。
这到底是什么意思?
文件中文档中的几个示例:
-
"刷新所有绑定和已解析实例的容器。">
-
"已解析的类型数组。">
-
"所有全局解析回调。">
-
"所有按类类型解决回调后。">
-
"所有按类类型解决回调后。">
现在我有点困惑,决心和解决在我的语言的简单翻译意味着安定下来,决定,确定,分离,分解,但这些对我来说没有任何意义。
你能澄清一下解析的含义吗? 我觉得一旦我理解了这个词,一切都会更顺利。
所以我打开了Laravel源文件并逐个文件,试图更好地理解MVC的整个实现如何包括路由,中间件组合成一段高级代码。
有一种更好的方法来理解框架源代码。使用调试器。
以任何简单的应用程序示例为例,设置 XDebug 并完成请求处理的整个过程。
首先跳过细节并找出请求处理中涉及哪些类和方法,然后您可以越来越深入。
至少对我来说,这种方式比仅仅阅读源代码要好得多。您将很快找到重要和不重要的内容,并能够专注于基本部分。
现在让我们回到您的resolution
问题:
"刷新所有绑定和已解析实例的容器。">
这是源文件 - 照明/容器/容器.php。以及相关文档:https://laravel.com/docs/5.0/container。
实际上,要了解源代码,您首先需要了解文档中的概念。在这种情况下,他们谈论的是依赖注入容器,您需要了解它的工作原理:
- 我们定义依赖关系,例如
public function __construct(FooBar $dependency)
我们不 - 直接传递这些依赖项:我们不做
$foo = new FooBar; $object = new MyObject($foo);
;相反,我们配置Laravel的服务容器,它为我们resolves
这些依赖项 - 所以这里的
resolution
是当我们问服务容器:"请给我们FooBar"的过程,它通过它的内部注册表并找出(解决(实际应该创建什么对象
我们为什么要这样做?因为我们不想对依赖项进行硬编码。
例如,你可以有一个依赖于Mailer
的类。在生产环境中,您希望SMTPMailer
此Mailer
,并且在测试时,您希望使用将电子邮件写入文件的MockMailer
。
因此,您将 Laravel 服务容器配置为在本地解析MockMailer
Mailer
,并将其解析为生产SMTPMailer
。
--- resolution process ------
| |
---------------------
| | ----------------
-------------------------------- | Container | ---->| SMTPMailer |
| MyObject | | | / ----------------
| | | | internal | | /
| __construct(Mailer $mailer) -|---->| | registry |------- ----------------
| | | | | | | MockMailer |
------------------------------- | | ----------------
---------------------
在MyObject
中,我们定义了一些抽象的Mailer
依赖关系,然后由Container
解析为SMTPMailer
或MockMailer
,具体取决于配置。
查看Laravel文档中的更多使用示例和解释。
"已解析的类型数组。">
这是我们之前请求的类型(如FooBar(的数组,这些类型已经解析(我们已经知道哪些实际的类映射到FooBar
(。
"所有全局解析回调。">
这是一个用于解析依赖关系的回调数组 - 这是 Laravel 内部注册表的一部分。
"所有按类类型解决回调后。">
这些是在解析完成时调用的回调。这可能与文档中的本节有关 - 容器事件。