小编给大家分享一下如何解析Laravel框架下的合同契约,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!
<强>合同强>
Laravel的契约是一组定义框架提供的核心服务的接口,例如我们在介绍用户认证的章节中到的用户看守器契约<代码> IllumninateContractsAuthGuard> 代码和用户提供器契约<代码> IlluminateContractsAuthUserProvider> 代码以及框架自带的App \用户模型所实现的<代码> IlluminateContractsAuthAuthenticatable 代码>契约。
<强>为什么使用契约强>
通过上面几个契约的源码文件我们可以看的到,Laravel提供的契约是为核心模块定义的一组interface.Laravel为每个契约都提供了相应的实现类,下表列出了Laravel为上面提到的三个契约提供的实现类。
所以在自己开发的项目中,如果Laravel提供的用户认证系统无法满足需求,你可以根据需求定义看守器和用户提供器的实现类,比如我之前做的项目就是用户认证依赖于公司的员工管理系统的API,所以我就自己写了看守器和用户提供器契约的实现类,让Laravel通过自定义的警卫和UserProvider来完成用户认证。自定义用户认证的方法在介绍用户认证的章节中我们介绍过,读者可以去翻阅那块的文章。
所以Laravel为所有的核心功能都定义契约接口的目的就是为了让开发者能够根据自己项目的需要自己定义实现类,而对于这些接口的消费者(比如:控制器,或者内核提供的AuthManager这些)他们不需要关心接口提供的方法具体是怎么实现的,只关心接口的方法能提供什么功能然后去使用这些功能就可以了,我们可以根据需求在必要的时候为接口更换实现类,而消费端不用进行任何改动。
<强>定义和使用契约强>
上面我们提到的都是Laravel内核提供的契约,在开发大型项目的时候我们也可以自己在项目中定义契约和实现类,你有可能会觉得自带的控制器,模型两层就已经足够你编写代码了,凭空多出来契约和实现类会让开发变得繁琐。我们先从一个简单的例子出发,考虑下面的代码有什么问题:
class OrderController extends 控制器 { ,,,public function getUserOrders () ,,,{ ,,,,,,,=美元订单,订单::,(& # 39;user_id # 39;,, & # 39;=& # 39;,, \身份验证::用户()→id)→(); ,,,,,,,return 观点::使(& # 39;order.index& # 39;,,紧凑(& # 39;订单# 39;)); ,,,} }
这段代码很简单,但我们要想测试这段代码的话就一定会和实际的数据库发生联系。
也就是说,ORM和这个控制器有着紧耦合。如果不使用雄辩的ORM,不连接到实际数据库,我们就没办法运行或者测试这段代码。这段代码同时也违背了“关注分离“这个软件设计原则。
简单讲:这个控制器知道的太多了。
控制器不需要去了解数据是从哪儿来的,只要知道如何访问就行。控制器也不需要知道这数据是从MySQL或哪儿来的,只需要知道这数据目前是可用的。
<强>关注点分离关注分离强>
每一个类应该只有一个责任,这责任应完全由类封装。
引用>每个类都应该只有单一的职责,并且职责里所有的东西都应该由这个类封装
接下来我们定义一个接口,然后实现该接口
interface OrderRepositoryInterface { ,,,public function userOrders (User $ user); } , class OrderRepository  implements OrderRepositoryInterface { ,,,public function userOrders (User $用户) ,,,{ ,,,,,,,::,(& # 39;user_id # 39;,, & # 39;=& # 39;,, $ user→id)→(); ,,,} }将接口的实现绑定到Laravel的服务容器中
应用程序::单例(& # 39;OrderRepositoryInterface& # 39;,, & # 39; OrderRespository& # 39;);然后我们将该接口的实现注入我们的控制器
class UserController extends 控制器 { ,,,public function __construct (OrderRepositoryInterface orderRepository美元) ,,,{ ,,,,,,,这个→美元orders =, orderRespository美元; ,,,} ,, ,,,public function getUserOrders () ,,,{ ,,,,,,,orders 美元;=,$ this→订单→userOrders (); ,,,,,,,return 观点::使(& # 39;order.index& # 39;,,紧凑(& # 39;订单# 39;)); ,,,} }如何解析Laravel框架下的合同契约