辅助函数

辅助函数

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 辅助函数来代替解析 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,可以看到一个对象的完整输出,无论位于何处都将终止程序并引发异常,但它不会显示常规调试器,而是将使用自定义异常处理程序并显示对象:

dd

非内置函数

有一些辅助函数需要您导入它们才能使用。这些函数不像上面讲的具有全局性。

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) 达到同样效果。

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

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~