xiaohuilam / laravel

Laravel 深入详解 —— 源代码解析,新手进阶指南
433 stars 80 forks source link

15. Laravel 神奇的 Manager 类 #16

Open xiaohuilam opened 6 years ago

xiaohuilam commented 6 years ago

Laravel 有不少门面类,如 SessionView 初一看令人诈舌,这些类的功能类不只一个,那么 Laravel 是怎么让这些奇葩的门面通往不止一个后门的?

类声明

https://github.com/xiaohuilam/laravel/blob/ca57c288f7825c42550333b613440cb4e824b3ad/vendor/laravel/framework/src/Illuminate/Support/Manager.php#L3-L9

这是一个抽象类。

属性

https://github.com/xiaohuilam/laravel/blob/ca57c288f7825c42550333b613440cb4e824b3ad/vendor/laravel/framework/src/Illuminate/Support/Manager.php#L10-L29

$app 是容器,这个 $customCreators 是什么鬼没看懂我们可以不管它。后面这个 $drivers,是一个数组,放的什么东西呢?

driver 在英语中是驱动器的意思。

算了。。。再这么讲下去太拖了。我们拉到最后

魔术函数

https://github.com/xiaohuilam/laravel/blob/ca57c288f7825c42550333b613440cb4e824b3ad/vendor/laravel/framework/src/Illuminate/Support/Manager.php#L144-L147

我们看到,当调用到当前实现类不存在方法时会调用 $this->driver() 下的同名方法。

https://github.com/xiaohuilam/laravel/blob/ca57c288f7825c42550333b613440cb4e824b3ad/vendor/laravel/framework/src/Illuminate/Support/Manager.php#L57-L75

然后 getDefaultDriverhttps://github.com/xiaohuilam/laravel/blob/ca57c288f7825c42550333b613440cb4e824b3ad/vendor/laravel/framework/src/Illuminate/Support/Manager.php#L47

这是抽象函数,我们到具体的例子中看吧。比如 session

https://github.com/xiaohuilam/laravel/blob/ca57c288f7825c42550333b613440cb4e824b3ad/vendor/laravel/framework/src/Illuminate/Session/SessionManager.php#L200-L203


所以,这些继承于 Illuminate\Support\Manager 的门后类,实现了向 driver 的穿透。

总结: Manager first, driver end. 经理先行,司机垫后