管理器

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

关于 Managers

介绍

Masonite使用强大众所周知Manager模式(也就我们所知道的构造者模式)。因为Masonite使用XManager命名类,我们在文档中将其称为“Manager模式”。

可以将Manager模式视为负责管理特定功能驱动程序。这些管理器负责实例FeatureXDriver类。例如,我们将UploadManager来管理上传特性,它将实例化UploadXDriver类。

在Masonite内部例子中,目前有两个类是针对上传特性:UploadDiskDriverUploadS3Driver。如果将config/storage.py文件里的DRIVER设置为s3UploadManager将使用UploadS3Driver来存储我们的文件。

这对于扩展管理器的功能非常有用。如果我们需要上传到Google,我们可以使用一个UploadGoogleDriver,将它放置到容器里。然后将DRIVER配置为googleUploadManager将会使用该类来完成文件存储。

创建管理

Masonite自带UploadManagerMailManager。我们还学习如何创建一个新管理器,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类,例如TaskToDoDriverTaskNoteDriver

注意配置为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()

阅读更多关于如何为管理器创建驱动器 关于驱动器 文档.

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

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

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

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

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


暂无话题~