服务提供者

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

服务提供程序

服务提供程序

简介

服务提供程序是Masonite的内建的关键模块,其唯一的功能就是将内容注册到服务容器中,或者从服务容器中检索并获取内容。关于服务容器,您可以从文档中获取更多信息Service Container。如果你查看config/providers.py文件的源代码,将会发现一个PROVIDERS列表,其中包含了构建框架所涉及的所有服务提供程序。

你可以创建自己的服务提供程序并把它添加到providers list中用以扩展Masonite,你也可以从providers list中移除一些providers,前提是你不再需要其提供的功能。如果你创建了自己的Service Provider,可以考虑将其共享至PyPi软件仓库以便其他开发者分享您的辛劳。更多关于Pypi的信息详见:pypi.org (The Python Package Index (PyPI) is a repository of software for the Python programming language.)

创建提供程序

使用craft命令,我们就可以简单的创建一个服务提供程序:

$ craft provider DashboardProvider

命令执行后将创建一个新的服务提供程序,位于项目 app/providers/DashboardProvider.py路径之下. 这个新的服务提供程序包含了两个简单的函数方法,一个register函数方法和一个boot 函数方法。接下来,我们将详解二者。

服务提供程序的执行

我们将通过几个架构示例来让您熟悉服务提供程序如何在底层运行。我们将关注一个简单的提供程序并逐步消化理解。

from masonite.provider import ServiceProvider
from app.User import User

class UserModelProvider(ServiceProvider):
    ''' 将用户模型绑定到服务容器中  '''

    wsgi = False 

    def register(self):
        self.app.bind('User', User)

    def boot(self):
        print(self.app.make('User'))

我们可以看到示例中有一个简单的服务提供程序,它把User模式注册到了容器中。我们必须详细了解其中的三个关键功能函数。

Python Web 服务网关接口

WSGI 是 Python Web Server Gateway Interface 的缩写,可直译为Python Web 服务网关接口,详见 www.python.org/dev/peps/pep-0333/

wsgi 设置为 False 模式,将向Masonite传递信息,用以标示这个特定的 provider 程序不需要启动。当 WSGI 服务首次运行,它将在 False 模式下执行所有的服务提供程序。在只需使用 provider 绑定内容到容器的场景中,且不需执行请求、路由等操作的前提下,可以考虑将 wsgi 设置为 False。ServiceProvider 类从 wsgi sets 继承而来,wsgi 的默认状态为 True。在把 wsgi 设置为 True 模式的每一项请求中,服务提供程序都将依序启动引导方法。

register函数方法

register 函数方法中,值得一提的是我们仅仅只是执行了将内容绑定到容器的操作。当服务器启动时,Masonite将执行全部服务提供程序之下的所有register函数方法。在这种模式之下,boot 方法将可以访问整个容器。

Boot函数方法

boot函数方法将可以访问容器中注册的、以及由容器实际解析的所有项目内容。由此,我们实际上可以将上面的provider重写为:

from masonite.provider import ServiceProvider
from app.User import User

class UserModelProvider(ServiceProvider):
    ''' 将用户模型绑定到服务容器中 '''

    wsgi = False 

    def register(self):
        self.app.bind('User', User)

    def boot(self, user: User):
        print(user)

这和上面完全一样。请注意, boot 方法是由容器解析的。

Provider Methods

服务提供程序有几种方法可以帮助我们把目标对象绑定到特定的容器中。

Commands

把命令绑定到容器中的操作可以从容的完成:

def register(self):
    self.commands(Command1(), Command2())

Middleware

我们也可以绑定 http 和 route 中间件到容器中:

def register(self):
    self.http_middleware([Middleware, Here])
    self.route_middleware({'middleware': Here})

请注意,route 中间件接受字典参数,而 http 中间件接受列表参数。

迁移

我们还可以非常容易的添加迁移目录:

def register(self):
    self.migrations('directory/1', 'directory/2')

路由

我们也可以添加路由:

def register(self):
    self.routes([
        get(...),
    ])

资源文件

我们还可以添加任何包含资源文件的目录:

def register(self):
    self.assets({'/directory': 'alias/'})

非常好!就是这么简单。看看其他服务提供者,以启发您如何创建自己的服务。同样,如果您创建了一个服务提供者,请考虑使其在 PyPi 上可用,以便其他人可以将其安装到他们的框架中。

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

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

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

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

上一篇 下一篇
贡献者:4
讨论数量: 0
发起讨论 查看所有版本


暂无话题~