首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel 中Facade门面是怎么实现?有没有其他实现方式?

Laravel 中Facade门面是怎么实现?有没有其他实现方式?

作者头像
写PHP的老王
发布2019-08-12 15:38:51
7570
发布2019-08-12 15:38:51
举报

Laravel 中Facade门面的实现


Route::get('/', function () {
    return view('welcome');
});

在laravel中的路由文件routes/web.php有这么一段代码,用于配置路由。这里Route就是用Facade实现类方法get的静态调用。

Laravel中的Facade解决了什么问题?

在php中,很多情况都需要使用一个容器获取到所有的对象,然后再调用改对象的方法,这样在编写代码的时候就会看到很长的一个调用链。例如: 在Yii2中,几乎所有的系统类都是在app容器当中,对这些系统类进行操作都需要执行Yii::$app->route获取到类实例,然后在执行方法Yii::$app->route->get()。但是如果用Facade实现之后的调用就是Route::get()。这样的写法是的代码更加简洁。

Laravel中Facade是怎么实现的?

思路是通过__callStatic魔术方法将方法调用代理到实际的对象方法中去。


class Route extends Facade{
    public static function getFacadeAccessor(){
        return 'router';
    }
}

根据每个Facade中提供的getFacadeAccessor返回实际的对象类名,获取类对象。每个类对象一旦创建,就放在一个静态数组中,因此在一次请求中最多只会被创建一次。

有没有其他的实现方式?

从上面的代码可以看到,其实核心就是一个静态代理的功能。那么有没有其他的实现方式了呢?

class Route extends Facade{

}

可以看出,上面的方式也能够实现静态代理,类似于Facade的功能。都是通过魔术方法实现。作用上,都简化了代码编写。

两种不同实现方式的区别

第二种实现方式有一个很大的缺点,那就是必须继承Facade类。PHP本身只能继承一个类,所以第二种实现方式对于一些需要继承其他类的对象是不适合的。

Laravel的实现方式,对类本身没有束缚,任何类对象都能够通过创建一个Facade对象实现静态代理。有很大的灵活性。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写PHP的老王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档