合约
合约
简介
在创建驱动程序时使用合约,以确保它们符合 Masonite 要求。它们是其他语言中的一种接口形式,其中子类需要具有该驱动程序工作所需的最少数量的方法。它是对类的承诺,它具有所需的确切方法。
合约被设计为遵循 「面向接口,而不是面向实现编程」的规则。遵循此规则时,所有相同类型的驱动程序都是可交换的。
驱动程序旨在轻松切换指定特性的功能,例如从文件系统存储切换到 Amazon S3 存储,而无需更改任何代码。因为从技术上讲,人们创建的每个驱动程序都可以拥有他们想要的任何方法,这就产生了一个技术挑战,即必须更改任何使用不支持特定方法的驱动程序的代码。例如,一个驱动程序没有 store
方法,而其他驱动程序有,当开发人员切换驱动程序时会抛出错误。
合约确保所有相似类型的驱动程序 (如 upload、queue 和 mail) 都包含相同的方法。虽然从合约继承的驱动程序可以拥有比所需的更多的方法,但它们不应该这么做。
如果您的驱动程序需要合约中现在可以使用的其他方法,则您的文档应该以某种明显的方式列出该警告。这意味着开发人员使用该新方法时,他们将无法自由切换到其他驱动程序,而不会遇到异常或必须手动使用驱动程序使用的方法。
因此,建议不要在驱动程序上编写其他方法,而应遵守基类和合约提供的方法。
入门
合约当前用于创建驱动程序,位于 masonite.contracts
命名空间中。创建驱动程序并使用协定如下:
from masonite.contracts import UploadContract
class UploadGoogleDriver(UploadContract):
pass
现在,此类将不断抛出异常,直到它覆盖了该类中所有必需的方法。
解析合约
如果您想 「编写接口代码而不是实现代码」,那么它很有用。这种类型的编程范例使您的代码非常易于维护,因为您可以简单地交换容器中具有相同合约的类。
例如,根据您尝试解析的驱动程序类型,Masonite 有特定的管理器合约。如果我们试图获取上传驱动程序的管理器,我们可以通过相应的上传管理器解析该管理器:
from masonite.contracts import UploadManagerContract
def show(self, upload: UploadManagerContract):
upload.store(..)
upload.driver('s3').store(..)
请注意,这只是返回用于上传的特定上传管理器。现在,上传管理器不是「具体」的实现,而是可以互换的。您可以在容器中加载 UploadManagerContract
的任何实例,Masonite 会为您获取它。
合约
创建驱动程序时,需要几个合约。如果您觉得需要一种用于新功能的新型驱动程序,则应首先创建合约,然后面向合约编程,而不是实现。以下是可用的合约类型。所有合约都与其驱动程序相对应。因此,需要 UploadContract
来创建上传驱动程序。
BroadcastContract
BroadcastManagerContract
CacheContract
CacheManagerContract
MailContract
MailManagerContract
QueueContract
QueueManagerContract
UploadContract
UploadManagerContract
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。