laravel/lumen —— 面向接口编程

面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。

多态

类有三大特性:封装继承多态

封装继承比较好理解,而多态比较抽象,不是很好解释。使用面向接口编程的思想就可以轻松简单的来解释。

多态顾名思义就是多种形态的意思。

以人和动物的例子来说明。人属于动物,可以走路、跑步、吃东西、睡觉、发声等。但是人区别于低级动物的地方是,人有思想。

使用代码来实现:

定义动物接口和人类接口。

人和猫两个类来实现。

猫饿了可以吃鱼。

但是人类高级一点,可以先思考,我要吃什么,怎么烹饪,创造工具,来提升我们生活水平。

这个时候我们可以说,动物有两种形态,一种是人,另外一种是猫。反过来也可以说人是动物,也是思想的高级生物。

怎么在代码上体现呢?

房子可以属于猫,或者人。拥有着可以在里面睡觉,使用不同的方式睡觉。

但是实验室,只有有思想能创造能发明的人类才能进入,而猫不行。

上面的例子可能有不妥的地方,但是也大致说明了,面向接口编程在多态中的应用。

契约

laravel/lumen框架中提供了契约这个概念。契约是指框架提供的一系列定义核心服务的接口。

比如,框架提供了Illuminate\Contracts\Mail\Mailer契约,那么我们可以通过实现这个契约来定制我们自己的发送邮件代码了。当然别人写的代码,由于他也实现了这个契约,我们可以直接拿过来使用。

laravel/lumen提供了一个Illuminate\Contracts\Config\Repository队列的契约。我们可以通过实现它来定制我们自己的配置操作类。

正常情况,我们都需要写一个package包,发布到packagist.org上去,然后通过composer下载到vendor中去。

但是为了方便起见,我就直接写在了app\Config目录下了。如题如何发布包到packagist.org上去可以参考我之前的博客创建自己的Composer包

我们需要实现Illuminate\Contracts\Config\Repository中所有的方法。

调用

laravel/lumen框架中,其实已经多这部分做了实现。上面只是一个简单的例子,用来说明契约的用法。

laravel/lumen提供的所有契约都可以在他的Github上找到。

服务容器和服务提供者

服务容器是一个用于管理类依赖和执行依赖注入的强大工具。他可以降低类之间的耦合,也可以方便我们去创建调用。

我们可以在bootstrap/app.php中去注册RedisConfig。然后使用app('redisconfig')方式来获取配置对象。

接下来调用与刚刚一样。

关于服务容器我们有3中绑定方式。

1、 单例

2、 普通

3、 绑定实例

当服务容器变多如何管理?还是第三方无法侵入我们的代码,如何提供服务容器?这时候可以使用服务提供者。

我们可以将服务提供者写在app/Providers目录下。然后将bootstrap/app.php中注册的容器搬入里面。最后在bootstrap/app.php注册服务提供者。

和之前一样可以调用。

门面

laravel/lumen的门面作为服务容器中的底层类的“静态代理”,相比于传统静态方法,在维护时能够提供更加易于测试、更加灵活的、简明且富有表现力的语法。

门面我们可以写入app\Facades文件夹下。

修改RedisConfigServiceProvider

然后我们就可以使用门面了。