门面为应用的服务容器中的绑定类提供了一个“静态”接口。该机制原理由 Facade 类实现,Laravel 自带的门面,以及创建的自定义门面,都会继承自 Illuminate\Support\Facades\Facade 基类。
(用Route来举例)
机制流程图:
facade顶层调用
1 | config/app.php 'aliases' => [ 'App' => Illuminate\Support\Facades\App:: class , 'Artisan' => Illuminate\Support\Facades\Artisan:: class , 'Auth' => Illuminate\Support\Facades\Auth:: class , 'Blade' => Illuminate\Support\Facades\Blade:: class , 'Cache' => Illuminate\Support\Facades\Cache:: class , 'Config' => Illuminate\Support\Facades\Config:: class , 'Cookie' => Illuminate\Support\Facades\Cookie:: class , 'Crypt' => Illuminate\Support\Facades\Crypt:: class , 'DB' => Illuminate\Support\Facades\DB:: class , 'Eloquent' => Illuminate\Database\Eloquent\Model:: class , 'Event' => Illuminate\Support\Facades\Event:: class , 'File' => Illuminate\Support\Facades\File:: class , 'Gate' => Illuminate\Support\Facades\Gate:: class , 'Hash' => Illuminate\Support\Facades\Hash:: class , 'Lang' => Illuminate\Support\Facades\Lang:: class , 'Log' => Illuminate\Support\Facades\Log:: class , 'Mail' => Illuminate\Support\Facades\Mail:: class , 'Password' => Illuminate\Support\Facades\Password:: class , 'Queue' => Illuminate\Support\Facades\Queue:: class , 'Redirect' => Illuminate\Support\Facades\Redirect:: class , 'Redis' => Illuminate\Support\Facades\Redis:: class , 'Request' => Illuminate\Support\Facades\Request:: class , 'Response' => Illuminate\Support\Facades\Response:: class , 'Route' => Illuminate\Support\Facades\Route:: class ,
|
Copier après la connexion
Route.php
(用phpstome的话,comm+b 就能够通过类名找到类所在的源码)
1 | vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php< ?phpnamespace Illuminate\Support\Facades; class Route extends Facade{ protected static function getFacadeAccessor()
|
Copier après la connexion
当我们使用 Route::get(); 时候其实可以看到这里并没有静态的get方法,那么就会调用Facade的魔术方法__callStatic
再次进入Facade的源码,找到一个 __callStatic的静态魔术方法
__callStatic :在对对象不存在的静态方法进行调用时自动执行;
1 | vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.phppublic static function __callStatic( $method , $args ) { $instance = static ::getFacadeRoot();
|
Copier après la connexion
再次进入getFacadeRoot方法的源码(其实也是当前facade文件)
1 | vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php protected static $resolvedInstance ;
|
Copier après la connexion