Laravel Facade 的详细解读

2022-05-15 0 569

下面由Laravel教程栏目给大家介绍Laravel Facade 的详细解读,希望对需要的朋友有所帮助!

Laravel Facade 的详细解读

大家好,今天带来的内容是 Laravel 的 Facade 机制实现原理。

Facade的简单使用

数据库的使用:

$users = DB::connection('foo')->select(...);

IOC容器

众所周知,IOC容器是 Laravel 框架的最最重要的部分。它提供了两个功能,IOC和容器。

IOC(Inversion of Control),也叫控制反转。说白了,就是控制对象的生成,使开发者不用关心对象的如何生成,只需要关心它的使用即可。而通过IOC机制生成的对象实例需要一个存放的位置,以便之后继续使用,便是它的容器功能。

这次不准备讲解IOC容器的具体实现,之后会有文章详细解读它。关于IOC容器,读者只需要记住两点即可:

根据配置生成对象实例;保存对象实例,方便随时取用;

简化后 Facade 类

<?phpnamespace facades;abstract class Facade{    protected static $app;    /**      * Set the application instance.     *     * @param  \\Illuminate\\Contracts\\Foundation\\Application  $app     * @return void     */    public static function setFacadeApplication($app)    {           static::$app = $app;    }     /**      * Get the registered name of the component.     *     * @return string     *     * @throws \\RuntimeException     */    protected static function getFacadeAccessor()    {        throw new RuntimeException('Facade does not implement getFacadeAccessor method.');    }    /**      * Get the root object behind the facade.     *     * @return mixed     */    public static function getFacadeRoot()    {           return static::resolveFacadeInstance(static::getFacadeAccessor());    }     /**     * Resolve the facade root instance from the container.     *     * @param  string|object  $name     * @return mixed     */    protected static function resolveFacadeInstance($name)    {        return static::$app->instances[$name];    }    public static function __callStatic($method, $args)    {        $instance = static::getFacadeRoot();        if (! $instance) {            throw new RuntimeException('A facade root has not been set.');        }           switch (count($args)) {            case 0:                return $instance->$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);        }     }}

代码说明:

$app中存放的就是一个IOC容器实例,它是在框架初始化时,通过 setFacadeApplication() 这个静态方法设置的它实现了 __callStatic 魔术方法getFacadeAccessor() 方法需要子类去继承,返回一个string的标识,通过这个标识,IOC容器便能返回它所绑定类(框架初始化或其它时刻绑定)的对象通过 $instance 调用具体的方法

创建自己的Facade:

TEST1 的具体逻辑:

<?phpclass Test1{public function hello(){print("hello world");}}

TEST1 类的Facade:

<?phpnamespace facades;/** * Class Test1 * @package facades * * @method static setOverRecommendInfo [设置播放完毕时的回调函数] * @method static setHandlerPlayer [明确指定下一首时的执行类] */class Test1Facade extends Facade{    protected static function getFacadeAccessor()    {           return 'test1';    }   }

使用:

use facades\\Test1Facade;Test1Facade::hello();  // 这是 Facade 调用

解释:

facades\\Test1Facade 调用静态方法 hello() 时,由于没有定义此方法,会调用 __callStatic;在 __callStatic 中,首先是获取对应的实例,即 return static::$app->instances[$name];。这其中的 $name,即为 facades\\Test1 里的 test1$app, 即为 IOC 容器,类的实例化过程,就交由它来处理。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 Laravel Facade 的详细解读 https://www.jike1995.com/35955.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务