前言
使用框架的伙伴应该都知道在5.1时框架新增了一个特性那就是本文将编写的门面,也就是facade这个特性。
使用过这个特性的都明白其中的好处,那就是方法调用可以直接静态进行调用,不用再使用关键字static来定义。
接下来咔咔将会从以下几个方面带着大家探索属于门面的故事。
一、简单认识一下在框架中的门面的好处
在之前有写过配置文件加载一文,在那一文中的最后提到过配置信息获取的几种方式。
其中有一种方式就是Config::get(),到这篇文章应该都知道使用Config获取配置信息时,必须先得引入use think\facade\Config,又因为在系统中注册了别名,所以直接使用use Config即可。
虽说我们使用的是use think\facade\Config,但是实际调用的方法却是thinkphp/library/think/Facade.php中的__callStatic方法。
然后会执行同文件的createFacade方法。
虽说现在还没有看源码,看着知道就好了,在调用createFacade方法时是直接从容器类里边获取的。
在学习容器时我们都知道容器是使用了注册树模式,需要使用对应对象实例的时候就可以直接获取,这样就避免了一个类反复的创建。这就是其中的一个优点。利用容器的特性
对于以前使用config来说,需要使用config的命名空间,然后进行实例化才能进行调用。
如果此时config不让使用了,需要使用自己创建的config类,如果没有使用门面模式,就需要修改大量的代码,而且是全局的。
但是如果使用了框架中的facade门面模式之后,你就只需要重写getFacadeClass这个方法即可,只需要改变里边的返回结果诶自己定义的即可,因为对于其它文件调用的地方它们不关心实例调用的是什么,只关心方法名和返回结果。
二、学习框架中facade的使用
首先创建一个控制器Facade,并且写上以下内容。
这里只是简单的使用门面的方式来获取配置文件信息。
在这里可以看到使用的是use Config,这个就是config类的别名。
别名的设置是在base.php中设置的。
在框架中如何正确的使用facade呢!
在app目录下新建一个文件夹facade,用来专门存放门面类。
这里创建了一个Sessions的类。
先做一个测试,检测代码是否写的有问题。在控制器的facade文件中进行测试。
这就是没有使用门面时的处理方式,需要引入对应的类,然后进行实例化,在用实例化的类进行方法调用。
打印结果,结果就是我们预期的结果。
那么这份代码怎么改为门面模式呢!跟着咔咔的脚步一步一步的来。
先在kaka目录下建立俩个目录,分别为facade和util
为什么要建立这俩个文件夹呢!util大家应该都知道那就是工具类,这种类文件是可以在其它项目中公用的。
也就是说我们只需要实现一份然后在其它项目中用的时候直接拿过去就可以了。
所以就可以直接把文件复制到util目录下,记得修改命名空间即可。
然后在到facade目录下新建一个Sessions的类,并且继承Facade。然后写上一下内容。
此时我们在来到控制器进行测试一下。
会发现结果跟之前是一致的,但是很明显的一个区别就是使用了facade模式后,可以直接使用静态方式进行调用。
还记得在之前说过门面的一个好处吗?
假设这个Sessions工具类在未来的一天停止使用了,那么我们只需要修改getFacadeClass方法里边的内容即可。