管理器
关于 Managers
介绍
Masonite使用强大众所周知Manager模式(也就我们所知道的构造者模式)。因为Masonite使用XManager
命名类,我们在文档中将其称为“Manager模式”。
可以将Manager模式视为负责管理特定功能驱动程序。这些管理器负责实例FeatureXDriver
类。例如,我们将UploadManager
来管理上传特性,它将实例化UploadXDriver
类。
在Masonite内部例子中,目前有两个类是针对上传特性:UploadDiskDriver
和UploadS3Driver
。如果将config/storage.py
文件里的DRIVER
设置为s3
,UploadManager
将使用UploadS3Driver
来存储我们的文件。
这对于扩展管理器的功能非常有用。如果我们需要上传到Google,我们可以使用一个UploadGoogleDriver
,将它放置到容器里。然后将DRIVER
配置为google
,UploadManager
将会使用该类来完成文件存储。
创建管理
Masonite自带UploadManager
和MailManager
。我们还学习如何创建一个新管理器,TaskManager
。
管理器可以存放在任意目录,不过如果是针对核心包的话,需要放置在masonite/manager
。
让我们创一个新文件:masonite/managers/TaskManager.py
真棒!所有的管理器需要继承masonite.managers.Manager
类。我们的TaskManager
看起来类似如下:
from masonite.managers import Manager
class TaskManager(Manager):
pass
真棒!继承了Manager类后我们就拥有大部分所需要的方法。唯一需要做的是告诉管理器如何创建驱动器。我们这里仅需两个属性:
from masonite.managers import Manager
class TaskManager(Manager):
config = 'TaskConfig'
driver_prefix = 'Task'
真棒。管理器即强大又简单。配置属性driver_prefix
用来配置使用哪个驱动。本例它是Task{X}Driver
。该管理器将会管理所有命名为Task{0}Driver
类,例如TaskToDoDriver
和TaskNoteDriver
。
注意配置为TaskConfig
而不是task
。该属性是绑定的名字而不是配置名称。我们可以如下绑定task
配置到容器:
from config import task
container.bind('TaskConfig', task)
因为它依赖于任务配置,所以使用我们的新任务管理器需要它。你可以在服务提供者创建该管理器。我们后面会创建服务提供者,但现在仅仅要知道配置在何处。
使用管理器
我们可以通过容器加载管理器。创建一个服务容器,参考服务容器文档。我们来看看如何创建一个基本容器:
from masonite.provider import ServiceProvider
from masonite.drivers import TaskTodoDriver
from masonite.managers import TaskManager
from config import task
class TaskProvider(ServiceProvider):
wsgi = False
def register(self):
self.app.bind('TaskConfig', task)
self.app.bind('TaskTodoDriver', TaskTodoDriver)
self.app.bind('TaskManager', TaskManager(self.app))
def boot(self, manager: TaskManager):
self.app.bind('Task', manager.driver(task.DRIVER))
真棒!我们将服务容器放置app/application.py
文件的PROVIDERS
列表。这样我们就可以使用我们新管理器:
from masonite.managers import TaskManager
def show(self, manager: TaskManager):
manager.driver('todo').method_here()
容器切换
虽然上面的代码已经可以正常工作了,但是如果可以将我们的容器使用缩写类名来获取到正常驱动的话就更方便了。我们可以在boot方法中实现:
class Task:
pass
..
def boot(self, manager: TaskManager):
self.app.bind('Task', manager.driver(task.DRIVER))
self.app.swap(Task, manager.driver(task.DRIVER))
现在我们使用Task
类就能取到正确的类了:
from somewhere import Task
def show(self, task: Task):
task.method_here()
阅读更多关于如何为管理器创建驱动器 关于驱动器 文档.
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。