Open xiaohuilam opened 6 years ago
Laravel 有不少门面类,如 Session、View 初一看令人诈舌,这些类的功能类不只一个,那么 Laravel 是怎么让这些奇葩的门面通往不止一个后门的?
Session
View
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,是一个数组,放的什么东西呢?
$app
$customCreators
$drivers
driver 在英语中是驱动器的意思。
算了。。。再这么讲下去太拖了。我们拉到最后
https://github.com/xiaohuilam/laravel/blob/ca57c288f7825c42550333b613440cb4e824b3ad/vendor/laravel/framework/src/Illuminate/Support/Manager.php#L144-L147
我们看到,当调用到当前实现类不存在方法时会调用 $this->driver() 下的同名方法。
$this->driver()
https://github.com/xiaohuilam/laravel/blob/ca57c288f7825c42550333b613440cb4e824b3ad/vendor/laravel/framework/src/Illuminate/Support/Manager.php#L57-L75
然后 getDefaultDriver, https://github.com/xiaohuilam/laravel/blob/ca57c288f7825c42550333b613440cb4e824b3ad/vendor/laravel/framework/src/Illuminate/Support/Manager.php#L47
getDefaultDriver
这是抽象函数,我们到具体的例子中看吧。比如 session
https://github.com/xiaohuilam/laravel/blob/ca57c288f7825c42550333b613440cb4e824b3ad/vendor/laravel/framework/src/Illuminate/Session/SessionManager.php#L200-L203
所以,这些继承于 Illuminate\Support\Manager 的门后类,实现了向 driver 的穿透。
Illuminate\Support\Manager
driver
总结: Manager first, driver end. 经理先行,司机垫后
经理先行,司机垫后
类声明
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
,是一个数组,放的什么东西呢?算了。。。再这么讲下去太拖了。我们拉到最后
魔术函数
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
然后
getDefaultDriver
, https://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
的穿透。