学习到加载路由注册那里,加载route目录下的route.php中的路由注册,如Route::get("hello/:name","hello/index"),跟着老师的步伐,跟踪到think\Route中的get( )方法,然后接下来跟踪到rule方法,发现rule方法中有调用$this->group->addRule();如下图:
此时会不由自主的想要去寻找$this->group属性是怎么来的,首先,我们来看看__construct方法,如下图:
跟踪到__construct( )方法,发现__construct方法中有App依赖注入,定位到setDefaultDomain( )方法,发现改方法中有$this->group属性的赋值,但这一步之前有小伙伴就有疑惑了,__construct中App的依赖注入是如何注入的,我们可以定位到App类加载route.php路由之前打印所有的类,发现think\Route类并没有被加载,使用Route::get("hello/:name","hello/index")这种形式会触发类的自动加载,会在base.php别名库中找到think\facade\Route类(即门面模式),具体流程如下图(图中绿色实线箭头为主线,在步骤八之前都是加载think\Route类):
从上图中我们可以看出,其实Route类实际是类的自动加载的,然后使用门面模式,静态访问get( )方法,按照这种思路,我总结出来了另外两种路由注册的方式:如下图:
Route::get('hello/:name', 'index/hello');//方法一 think\Container::get('think\facade\Route')::get('hello/:name', 'index/hello');//方法二 (门面模式,其实和方法一差不多,就是直接跳过Route类的自动加载) think\Container::get('route')->get('hello/:name', 'index/hello');//方法三(直接跳过门面模式)
上面三种方式,我测试过有效果。
明确think\Route类加载的过程,结合前面的容器章节,我们很容易就能分析出think\Route类中的$this->group属性了,$this->group属性实际上是实例化的think\route\Domain类,关于think\route\Domain类的分析,请关注后续文章,谢谢大家!
课程详情:<<BAT资深工程师由浅入深分析Tp5和Tp6底层源码>>