为了账号安全,请及时绑定邮箱和手机立即绑定

TP5源码课think\Route类中rule( )方法中$this->group属性分析(TP5源码课程路由机制深度分析(一) )

2019.05.21 01:40 3291浏览

    学习到加载路由注册那里,加载route目录下的route.php中的路由注册,如Route::get("hello/:name","hello/index"),跟着老师的步伐,跟踪到think\Route中的get( )方法,然后接下来跟踪到rule方法,发现rule方法中有调用$this->group->addRule();如下图:

image.png

        此时会不由自主的想要去寻找$this->group属性是怎么来的,首先,我们来看看__construct方法,如下图:

image.png

image.png

    跟踪到__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目录 route.php Route  get('hello  name', 'index hello').png

从上图中我们可以看出,其实Route类实际是类的自动加载的,然后使用门面模式,静态访问get( )方法,按照这种思路,我总结出来了另外两种路由注册的方式:如下图:

image.png

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底层源码>>


点击查看更多内容
0人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消