辅助函数
辅助函数
v2.1中默认删除了内置的全局辅助函数,但它们并没被弃用,您还可以使用它们。
介绍
Masonite 致力于帮助开发人员摆脱各种繁琐重复的工作。因此,Masonite 具有多个辅助函数,使您可以快速编写代码,且不必担心导入问题或从服务容器中检索内容。使用Masonite内置的几个函数可以简单地检索服务容器中的内容,这些函数称为 "Built in Helper Functions",您可能会称其为内置函数。
这些函数不需要任何导入就可以直接使用的,与 print()
函数类似。这些功能都在HelpersProvider
服务提供者中设置。
您可以继续随意使用这些辅助函数,但是大多数开发人员都使用它们来快速模拟事物,然后稍后再回来进行重构。
我们看下该服务提供者程序里代码更直接:
masonite.providers.HelpersProvider
class HelpersProvider(ServiceProvider):
wsgi = False
def register(self):
pass
def boot(self, view: View, request: Request):
''' Add helper functions to Masonite '''
builtins.view = view.render
builtins.request = request.helper
builtins.auth = request.user
builtins.container = self.app.helper
builtins.env = os.getenv
builtins.resolve = self.app.resolve
view.share({'request': request.helper, 'auth': request.user})
注意我们只是通过此提供者程序添加内置函数。
内置辅助函数
下面的函数列表是“内置”函数,这意味着它们是全局的,与 print
方法一样。这些辅助函数无需任何导入即可使用。
Request
Request 类具有一个简单的 request()
辅助函数。
def show(self):
request().input('id')
等价于:
def show(self, request: Request):
request.input('id')
注意,我们没有在文件顶部导入任何内容,也没有从服务容器中注入任何内容。
View
view()
函数只是 View
类的快捷方式。
def show(self):
return view('template_name')
等价于:
def show(self, view: View):
return view.render('template_name')
您可以使用 Mail 辅助函数来代替解析 mail 类:
def show(self):
mail_helper().to(..)
等价于:
from masonite import Mail
def show(self, mail: Mail):
mail.to(..)
Auth
auth()
函数是获取当前用户的快捷方式。我们可以像这样检索用户:
def show(self):
auth().id
等价于:
def show(self, request: Request):
request.user().id
如果没有用户,它将返回 None
,因此在实际应用程序中,它可能类似于:
def show(self):
if auth():
auth().id
这是因为您不能在 None
上调用 .id
属性
Container
我们可以使用 container()
函数获取容器:
def show(self):
container().make('User')
等价于:
def show(self, request: Request):
request.app().make('User')
Env
我们可能需要从控制器或应用程序的其他部分获取一些环境变量。为此,我们可以使用 env()
函数。
def show(self):
env('S3_SECRET', 'default')
等价于:
import os
def show(self):
os.environ.get('S3_SECRET', 'default')
Resolve
我们可以使用 resolve()
函数从容器中解析任何内容。
def some_function(request: Request):
print(request)
def show(self):
resolve(some_function)
等价于:
def some_function(request: Request):
print(request)
def show(self, request: Request):
request.app().resolve(some_function)
这些只是添加到 Python 内置函数中的函数。
Die and Dump
Die 和 dump 调试 PHP 和其他编程语言中的对象的常用方法. Laravel 使用 dd()
程序将终止程序并转储您要检查的对象。dd()
本质上是在代码中添加一个断点,该断点将对象的属性转储到浏览器中。
例如,我们可以终止执行并转储我们找到的用户:
from app.User import User
def show(self):
dd(User.find(7))
如果打开浏览器并访问该URL,可以看到一个对象的完整输出,无论位于何处都将终止程序并引发异常,但它不会显示常规调试器,而是将使用自定义异常处理程序并显示对象:
非内置函数
有一些辅助函数需要您导入它们才能使用。这些函数不像上面讲的具有全局性。
Config
config 辅助函数用于获取 config 目录中某些配置的值。例如,获取 config / storage.py
文件中的 location 的值。
此函数可用于从任何配置文件中检索值,我们将使用 config / storage.py
文件作为示例。
如下:
config/storage.py
DRIVERS = {
's3': {
'client': 'Hgd8s...'
'secret': 'J8shk...'
'location': {
'west': 'http://west.amazon.com/..'
'east': 'http://east.amazon.com/..'
}
}
}
我们可以在字典中获得 west 的值,如下所示:
from masonite.helpers import config
def show(self):
west = config('storage.drivers.s3.location.west')
可以代替导入字典本身:
from config import storage
def show(self):
west = storage.DRIVERS['s3']['location']['west']
注意使用小写
storage.drivers.s3
代替storage.DRIVERS.s3
。 两者皆可,因为config 函数不区分大小写。
Optional
此辅助函数允许您将任何对象包装进去中,并在该对象上调用属性或方法,即使它们不存在也是如此。如果存在,则将返回方法,如果不存在,则将返回 None
。
举一个我们通常会写的例子:
def show(self):
user = User.find(1)
if user and user.id == 5:
# do code
...
现在,我们可以改用以下代码片段:
def show(self):
if optional(User.find(1)).id == 5:
# do code
...
Compact
Compact 是个非常好用的辅助函数,可以让您在控制中不再写重复的字典。
例如:
def show(self, view: View):
posts = Post.all()
users = User.all()
articles = Articles.all()
return view.render('some.template', {'posts': posts, 'users': users, 'articles': articles})
注意,我们的 Python 变量与我们希望包含在模板中的变量完全相同。
你可以使用 compact 函数:
from masonite.helpers import compact
def show(self, view: View):
posts = Post.all()
users = User.all()
articles = Articles.all()
return view.render('some.template', compact(posts, users, articles))
您还可以传入一个字典,该字典将相应的同步更新:
from masonite.helpers import compact
def show(self, view: View):
posts = Post.all()
users = User.all()
user_blogs = Blog.where('user_id', 1).get()
return view.render('some.template', compact(posts, users, {'blogs': user_blogs}))
Collect
您可以使用 orator 返回模型集合使用使用过的 Collection 类。例如:
from masonite.helpers import collect
def show(self):
collection = collect([1,2,3])
if collection.first() == 1:
# do action
您可以访问普通集合对象上的所有方法。
Query String
Masonite 内部使用了该辅助函数,如果您发现也需要以与 Masonite 相同的方式解析查询字符串,则可以使用此辅助函数,如下所示:
from masonite.helpers import query_string
qs = "param=value&filters[name]=Joe&filters[age]=25"
query_string(qs)
"""
{
"param": "value",
"filters": {
"name": "Joe",
"age": "25"
}
}
"""
注意:翻译过程中发现 Masonite Version 2.3.7 执行上面代码会报 cannot import name 'query_string' from 'masonite.helpers' 的错误。读源码发现可以导入 from masonite.helpers.routes import query_parse 使用 query_parse(qs) 达到同样效果。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。