如何在Laravel框架中使用合同契约

  介绍

本篇文章为大家展示了如何在Laravel框架中使用合同契约,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Laravel是什么

Laravel是一套简洁,优雅的PHP Web开发框架。它可以让你从面条一样杂乱的代码中解脱出来,它可以帮你构建一个完美的网络应用,而且每行代码都可以简洁,富于表达力。

<强>合同

Laravel的契约是一组定义框架提供的核心服务的接口,例如我们在介绍用户认证的章节中到的用户看守器契约<代码> IllumninateContractsAuthGuard> IlluminateContractsAuthUserProvider> IlluminateContractsAuthAuthenticatable 契约。

<强>为什么使用契约

通过上面几个契约的源码文件我们可以看的到,Laravel提供的契约是为核心模块定义的一组interface.Laravel为每个契约都提供了相应的实现类,下表列出了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框架中使用合同契约