驱动器
关于驱动程序
介绍
驱动器只是由Manager模式管理的简单扩展。如果我们有UploadManager
,也许我们还想创建一个UploadDiskDriver
或者UploadS3Driver
来支持文件和Amazon S3存储。未来我们还可能创建新的驱动,例如UploadAzureDriver
和UploadGoogleDriver
。驱动器可以小到一个方法,大到多个方法。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
里找到。如果我们设置配置文件里的DRIVER
为google
,manager就在容器内查找UploadGoogleDriver
类。阅读更多关于 Managers文档。
就是这样!驱动器其实就是包含一两个方法的简单类。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。