通过laravel重设密码的代码快速学习laravel的重要概念-02

    |     2021年4月20日   |   学习偶记   |     评论已关闭   |    216

上一篇我们解读了php的一些类的用法,下面再看看laravel特有的Facade类。在学习laravel类的时候,先推荐阅读这两篇文章:

PHP abstract与interface之间的区别

PHP设计模式之工厂模式(Factory)了解下

另外,你也阅读以下laravel文档中有关服务、服务容器、契约、门面的相关概念。如果你是初学者,可能会看的头昏脑涨,不用试图去理解它,我会用很简单的方式描述他们的作用。

laravel的门面Facades

laravel的契约Contracts

laravel的服务提供者providers 

laravel的服务容器container

用例子来简单描述一下laravel的这几个概念。

laravel是一个框架,它相当于是一个培训中心。你家的孩子想补习,相当于要写代码的你,要写一个功能。

培训中心里有很多老师,这些老师有些是一个人完成一个业务,比如2年级数学补习,有些业务,是几个老师一起协作完成的,比如小升初强化训练补习,需要好几个老师。

那么,这些老师就是服务提供者。比如2年级数学补习老师,他不管你要学什么,反正2年级数学所有的补习课程他都会。

上课不可能站门外上啊,也不可能只有你一家小孩要补习呀,所以就要到教室里学习,这个教室就是服务容器。每个老师需要和教室绑定,比如数学老师就是在1教室授课。

OK,我们理解了,老师提供服务,绑定在教室中提供这个服务,那么门面和契约又是什么呢?

门面和契约就是培训科目的章节索引表,只是门面是培训中心统一印的,而契约是老师自己写的,也许上面写了自己的特长或者他愿意额外教的。

然后,我们用给孩子补习乘法口诀表为例,说明一下这个业务逻辑。

你找到培训中心(laravel),说需要学乘法口诀表。laravel告诉你在1教室是专门学数学的(服务容器),然后你进去,选择A老师(服务提供者),然后A老师过来,提供了自己可以教授的章节内容(门面或者契约),你说学习乘法口诀表,然后A老师开始教授你相应的知识。

假设没有培训中心,你可能需要举个牌子,上面写着,我需要学习乘法口诀表。等老师上门。如果一百个有类似需求的学生,都这样举着牌子。是不是重复又浪费纸板?

接下来让我们开始艰难的探索吧【说实话,我真的被laravel的这种设计绕的头晕眼花,当然,理解万岁。】

首先我们回到那个发送email链接的代码吧。

这个$this->broker()的探索之路:

可以看到他是Password类的一个静态方法。那他到底返回什么呢,接着找它的定义。

原来它是一个门面。就相当于它是一张课程表。提供了它能提供的各种学习章节。让我们继续找找这个broker()方法。

然而,诡异的一幕出现了,它竟然没有这个方法。然后你这时候再去阅读laravel文档的门面部分,会发现这样一段话:

在 Laravel 应用中,Facade 就是一个可以从容器访问对象的类。其中核心的部件就是 Facade 类。不管是 Laravel 自带的 Facades,还是自定义的 Facades,都继承自 Illuminate\Support\Facades\Facade 类。

Facade 基类使用了__callStatic() 魔术方法,直到对象从容器中被解析出来后,才会进行调用。

从这句话我们可以明白,它是一个类对象,在用的时候才被实例化。

于是,我们就要理解服务容器的概念了。就是所谓的教室。如果一个老师想上课(提供服务),必须要确认在某一间教室(绑定服务)。所以我们找找这个服务容器。

然后你就可以找到这个服务容器:\vendor\laravel\framework\src\Illuminate\Auth\Passwords\PasswordBrokerManager.php ,里面绑定了两个服务。

其实可以这样理解,就是在这个文档中,告诉别人,我能提供什么类和方法给你用。这样做的好处呢,就是你不用use 长长的类名。并且你随时可以用你写的服务,替换掉旧服务,而不用去改业务逻辑代码。

回到我们截图中的代码,registerPasswordBroker()方法,显示绑定了一个PasswordBrokerManager类的单例。singleton 方法将类或接口绑定到只解析一次的容器中。一旦单例绑定被解析,相同的对象实例会在随后的调用中返回到容器中。就是我们在执行$this->broker()的时候,它就生成一个PasswordBrokerManager类,并且等候指令。

然后代码中又绑定了一个auth.password.broker的服务,而这个服务,就是通过make(auth.password)生成的那个PasswordBrokerManager类的broker()方法。

这个make(auth.password) 在这里就等同 new PasswordBrokerManager;

所以,我们就找到了$this->broker()这个方法是怎么实现的了。然后看看broker代码的定义。

接下来你就愉快的阅读代码了。

让我们看看这个broke是什么东东。

看不出来,继续dd getconfig

然后后面继续跟踪代码的过程就不写了,毕竟写这篇文章的主要目的是为了让大家了解门面等等概念。

噢!评论已关闭。