驱动器

未匹配的标注
本文档最新版为 4.0,旧版本可能放弃维护,推荐阅读最新版!

关于驱动程序

介绍

驱动器只是由Manager模式管理的简单扩展。如果我们有UploadManager,也许我们还想创建一个UploadDiskDriver或者UploadS3Driver来支持文件和Amazon S3存储。未来我们还可能创建新的驱动,例如UploadAzureDriverUploadGoogleDriver。驱动器可以小到一个方法,大到多个方法。Manager模式让扩充Masonite能力变得及其简单。

创建驱动

让我们继续来创建一个简单的驱动,它已经在框架中UploadDiskDriver

如果是创建一个驱动就可以存放在任意位置,如果是针对Masonite core的话就需要放置在masonite/dirvers。对于我们的UploadDiskDriver,我们建立为:masonite/drivers/UploadDiskDriver.py

我们创建的类类似如下:

from masonite.contracts import UploadContract

class UploadDiskDriver(UploadContract):
    pass

协议

为了确保所有的驱动遵循相同结构,我们可以使用Contracts。如果你有学习其他语言,Contacts就是基础接口。它们确保所有继承的类实现了最小方法。它在没有按最小方法实现的话,在运行过程将会抛出异常。

对于我们特定的驱动,它需要继承UploadContract类: UploadContract:

from masonite.contracts import UploadContract

class UploadDiskDriver(UploadContract):
    pass

编写我们的驱动

非常简单,现在我们可以开始像写我们驱动了,在最终使用中,我们希望开发人员可以执行如下操作:

from masonite import Upload

def show(self, upload: Upload):
    upload.store(request().input('file'))

所以我们需要实现一个store方法。

from masonite.contracts import UploadContract

class UploadDiskDriver(UploadContract):

    def store(self, fileitem, location=None):
        pass

真棒。这里是关键部分了。我们的Manager针对我们驱动器(这里是UploadManager)将会在构造器为我们解决依赖问题。也就是说,所有我们放在构造器的组件都会被自动注入到驱动中。就这里的需求,我们需要应用针对存储的配置项。

from masonite.contracts import UploadContract
from config import storage, application

class UploadDiskDriver(UploadContract):

    def __init__(self, cls: SomeClass):
        self.cls = cls
        self.config = storage
        self.appconfig = application

    def store(self, fileitem, location=None):
        pass

真棒。如果你对于依赖注入仍还糊涂的话,请阅读服务容器 文档。

现在,我们的配置已经注入到我们类中,我们可以继续实现我们的store()方法:

from masonite.contracts import UploadContract
from config import storage, application

class UploadDiskDriver(UploadContract):

    def __init__(self):
        self.config = storage
        self.appconfig = application

    def store(self, fileitem, location=None):
        filename = os.path.basename(fileitem.filename)

        if not location:
            location = self.config.DRIVERS['disk']['location']

        location += '/'

        open(location + filename, 'wb').write(fileitem.file.read())

        return location + filename

真棒!这里store()方法简单获取到文件并写入fileitem内容到硬盘。

使用驱动

现在我们的驱动已经创建了,我们需要通知Manager。学习如何创建managers请阅读关于 Managers文档。我们的manager将知道在服务容器内的所有驱动器。我们可以创建一个新的服务容器注册类到容器里。以下是UploadProvider范例:

from masonite.provider import ServiceProvider
from masonite.managers import UploadManager
from masonite.drivers import UploadDiskDriver
from config import storage

class UploadProvider(ServiceProvider):

    wsgi = False

    def register(self):
        self.app.bind('StorageConfig', storage)
        self.app.bind('UploadDiskDriver', UploadDiskDriver)
        self.app.bind('UploadManager', UploadManager(self.app))

    def boot(self, manager: UploadManager):
        self.app.bind('Upload', manager.driver(storage.DRIVER))

现在我们知道如何在容器里配置存储了,将我们的驱动绑定到Manager。我们的manager在容器的UploadXDrivers里找到。如果我们设置配置文件里的DRIVERgoogle,manager就在容器内查找UploadGoogleDriver类。阅读更多关于 Managers文档。

就是这样!驱动器其实就是包含一两个方法的简单类。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/masonite/2.3/ma...

译文地址:https://learnku.com/docs/masonite/2.3/ma...

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~