您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Facade 的运行机制

2024/7/15 16:44:51发布18次查看
门面为应用的服务容器中的绑定类提供了一个“静态”接口。该机制原理由 facade 类实现,laravel 自带的门面,以及创建的自定义门面,都会继承自 illuminate\support\facades\facade 基类。
(用route来举例)
机制流程图:
facade顶层调用 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, //例如我们看route,平时我们调用route::get这样,其实是调用alias的route,然后这个route指向了illuminate\support\facades\route这个类,至于为什么能实现这种机制,需要继续分析 'schema' => illuminate\support\facades\schema::class, 'session' => illuminate\support\facades\session::class, 'storage' => illuminate\support\facades\storage::class, 'url' => illuminate\support\facades\url::class, 'validator' => illuminate\support\facades\validator::class, 'view' => illuminate\support\facades\view::class, 'form' => collective\html\formfacade::class, 'html' => collective\html\htmlfacade::class, ],
route.php (用phpstome的话,comm+b 就能够通过类名找到类所在的源码)
vendor/laravel/framework/src/illuminate/support/facades/route.php$method(); case 1: return $instance->$method($args[0]); case 2: return $instance->$method($args[0], $args[1]); case 3: return $instance->$method($args[0], $args[1], $args[2]); case 4: return $instance->$method($args[0], $args[1], $args[2], $args[3]); default: return call_user_func_array([$instance, $method], $args); } }
再次进入getfacaderoot方法的源码(其实也是当前facade文件) vendor/laravel/framework/src/illuminate/support/facades/facade.php /** * the resolved object instances. * * @var array */ protected static $resolvedinstance; //这个是一个存放实例的,这个是用来解析出实例的 public static function getfacaderoot() { return static::resolvefacadeinstance(static::getfacadeaccessor()); //运行了2个方法,其中getfacadeaccessor作为了resolvefacadeinstance的参数来传递 } /** * get the registered name of the component. * * @return string * * @throws \runtimeexception */ protected static function getfacadeaccessor() //返回和抛出报错信息 { throw new runtimeexception('facade does not implement getfacadeaccessor method.'); } /** * resolve the facade root instance from the container. * * @param string|object $name * @return mixed */ protected static function resolvefacadeinstance($name) //这个方法需要的是一个$name变量,这个变量就是getfacadeaccessor(),也就是在vendor/laravel/framework/src/illuminate/support/facades/route.php这里的返回的字符串,因为route.php重写了getfacadeaccessor方法,所以能够获取到 { if (is_object($name)) { return $name; } if (isset(static::$resolvedinstance[$name])) { return static::$resolvedinstance[$name]; } return static::$resolvedinstance[$name] = static::$app[$name]; //这里是用$app来解析container里面的对象,以前说过的ioc,将这个获取到的关键字放到$app[]来解析,然后将这个解析的container对象存放到$resolvedinstance,然后返回 }
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product