服务提供者
服务提供者是 Masonite 内建的关键模块,其唯一的功能就是将内容注册到服务容器中,或者根据请求运行逻辑。如果你查阅 config/providers.py
文件,将会看到其中有一个 PROVIDERS
列表,其中包含了构建框架所涉及的所有服务提供者。
尽管不太多见,你也可以创建你自己的服务提供者并将其添加到 providers 列表中,用以扩展 Masonite,或者甚至你也可以移除你不需要用到的服务提供者。如果你创建了自己的服务提供者(Service Provider),可以考虑将其发布到 PyPi 上,以便其他人也可以安装到框架中。
创建服务提供者
使用 craft 命令,可以简单地创建一个服务提供者:
$ python craft provider DashboardProvider
此操作会在创建新的服务提供者 app/providers/DashboardProvider.py
。这个新的服务提供者有两个简单方法,一个 register
方法和一个 boot
方法。稍后,我们会详细介绍这两个方法。
服务提供者的执行
我们将通过几个架构示例来让您熟悉服务提供者在底层是如何运行的。首先,我们来看看一个简单的服务提供者。
from masonite.providers import Provider
class YourProvider(Provider):
def __init__(self, application):
self.application = application
def register(self):
self.application.bind('User', User)
def boot(self):
print(self.application.make('User'))
我们可以看到,此处我们有一个简单的服务提供者,用来将 User
模型注册到服务容器中。这里有三个关键特性是我们必须详细了解的。
Register
在 register
方法中,很重要的一点是我们只绑定东西到容器中。当服务提供者注册到容器时,就会运行 register 方法,同时其中的类就会注册到容器中。
Boot
boot 方法可以访问所有注册到容器中的项目。boot 方法在请求期间运行而且实际上是有容器解析的。因此,我们可以将以上的服务提供者重写成这样:
from masonite.provider import ServiceProvider
from app.User import User
class UserModelProvider(ServiceProvider):
''' 绑定 User 模型到服务提供者中 '''
def __init__(self, application):
self.application = application
def register(self):
self.application.bind('User', User)
def boot(self, user: User):
print(user)
这和上面完全一样。请注意,
boot
方法是由容器解析的。
注册服务提供者
当你创建了服务提供者,你需要将其注册到 PROVIDERS
列表中。很可能就在 config/providers.py
文件中:
PROVIDERS=[
#..
UserModelProvider,
]
注册完后,在框架启动或者注册时会将 register 和 boot 方法载入其中。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。