laravel 学习指南 第六章 第六节
- TOC
{:toc}
6.6 合约
6.6.1 简介
Laravel的合约是一组由框架(framework)提供的核心服务接口。
例如:
Illuminate\Contracts\Queue\Queue
合约规定,列队工作需要的方法。
Illuminate\Contracts\Mail\Mailer
合约规定,发送电子邮件的方法。
每个合约都有框架提供的,相应的实现方法。
例如:
Laravel提供一个列队实现方法与各种驱动,和一个由SwiftMailer
提供的邮件接收服务。
所有的Laravel合约都在各自的github
仓库中更新。这为所有的合约,提供了一个快速参考点,以及一个单一的分离包,用于包开发。
6.6.1.1 合约Vs.门面
Laravel的门面提供一种简单的方法,利用Laravel服务无须输入和提示。这好于使用需要服务容器的合约方法。
但是,使用合约运行你定义依赖类。多余大多数应用,使用门面就好了。
但是,如果你真有的需要额外的松耦合,合约就可以提供,阅读下面的了解更多。
6.6.2 为什么用合约?
关于合约你可能有几个问题要问。为什么全部使用接口?不使用接口会更复杂?
下方是使用接口的重要原因:松耦合
与简洁性
6.6.2.1 松耦合
首先,让我们来看一个使用紧耦合缓存实现方法的代码:
1 |
|
这这个类中,代码是使用紧耦合,到给定的缓存实现方法。
因为是从一个包中取得缓存,所以这是一个紧耦合。
如果这个包的API发生了改变,我们的代码也要随之改变。
同样的,如果我们要使用其他技术(例如:redis),取代正在使用的技术(Memcached),我们还是要修改代码。
我们的类不应该用这些设定,例如,谁为他们提供数据,它是如何提供的等等。
使用下方松耦合方法,不需要绑定注入,进而优化代码:
1 |
|
现在代码没有连接任何的服务提供者,甚至Laravel。由于合约包中没有实现方法也没有依赖关系,你可以很容易的替换合约,更换缓存技术,而无需修改代码。
6.6.2.2 简洁性
当所有的Laravel的服务,在简单接口中整洁的定义,就可以很容易的给定服务提供的功能。
合约服务为框架功能提了简洁的文档。
当你使用简单接口时,你的代码更容易理解和维护。
6.6.3 合约参考
6.6.4 如何使用合约
那么,如果使用一个合约的实现方法?这其实很简单。
许多类型的Laravel类,是通过服务容器解决的,包括控制器,事件监听,中间件,列队甚至是路由。
要使用合约,只需要进行类型提示,注册类的接口函数。
例如:下面的事件监听器:
1 |
|
当事件监听器运行完成,服务容器将读取构造函数的类型提示,并注入相应的值。