路由

未匹配的标注

Masonite 附带了一个非常强大的路由引擎。 路由有助于将浏览器 URL 链接到其控制器和控制器的方法。

创建一个路由

路由是通过导入 Route 类并使用你自己定义的 URL 和你自己定义的控制器来创建的。 这些路由需要包含在路由文件中的“ROUTES”列表中。

from masonite.routes import Route

ROUTES = [
    Route.get('/welcome', 'WelcomeController@show')
]

第一个参数是您希望在应用程序中可用的 URL。 在上面的示例中,这将允许任何人访问 /welcome URL。

第二个参数是您要将此路由绑定到的 Controller

路由可用方法

您可以选择定义任何一个可用的动词:

Route.get('/welcome', 'WelcomeController@show')
Route.post('/welcome', 'WelcomeController@show')
Route.put('/welcome', 'WelcomeController@show')
Route.patch('/welcome', 'WelcomeController@show')
Route.delete('/welcome', 'WelcomeController@show')
Route.options('/welcome', 'WelcomeController@show')
Route.view('/url', 'view.name', {'key': 'value'})
Route.resource('/users', 'UsersController')
Route.api('/users', 'UsersApiController')

除了这些路由动词之外,您还可以使用内置路由:

Route.redirect('/old', '/new', status=301)
Route.permanent_redirect('/old', '/new')

控制器绑定

有多种方法可以将控制器绑定到路由。

字符串绑定

您可以使用定义控制器类及其方法的字符串绑定
{ControllerClass}@{controller_method}:

Route.get('/welcome', 'WelcomeController@show')

注意:使用字符串绑定时,必须确保该控制器类可以正确导入,并且
控制器类位于 注册控制器位置

提示:建议使用字符串表达方式而不是在路由文件中引入类文件,因为这样可以减少循环依赖。

绑定类

你可以在路由文件中引入你的控制器文件,并在路由表通过提供类目或者类+方法名的方式来表示一个路由项。

from app.controllers import WelcomeController

Route.get('/welcome', WelcomeController)

这里由于没有定义调用的方法名称,这导致路由无法访问控制器内的有效方法。你应该在控制文件中定义可调用的方法名称,如下所示:

class WelcomeController(Controller):

    def __call__(self, request:Request):
        return "Welcome"

你可以直接通过class.method的便捷方式来定义一个路由项:

from app.controllers import WelcomeController

Route.get('/welcome', WelcomeController.show)

实例绑定

你也可以直接在路由表中绑定一个控制器实例:

from app.controllers import WelcomeController

controller = WelcomeController()

Route.get('/welcome', controller)

这里由于没有定义调用的方法名称,这导致路由无法访问控制器内的有效方法。你应该在控制文件中定义可调用的方法名称,比如call方法:

class WelcomeController(Controller):

    def __call__(self, request:Request):
        return "Welcome"

路由选项

你可以在路由表中定义多个可用的方法来修改在请求过程中的一些行为;

中间件

你可以添加任意多个路由中间件 Routes Middlewares:

Route.get('/welcome', 'WelcomeController@show').middleware('web')
Route.get('/settings', 'WelcomeController@settings').middleware('auth', 'web')

这会在项目中的中间件配置单中选取中相同key的中间件来拦截处理对应的相关请求。

你可以为特定路由排除一个或多个 路由中间件

Route.get('/about', 'WelcomeController@about').exclude_middleware('auth', 'custom')

路由名称

你可以为你的路由指定一个名称。这用于通过使用比 URL 更静态的路由名称来轻松编译应用程序其他部分中的路由信息。

Route.get('/welcome', 'WelcomeController@show').name('welcome')

路由参数

你可以在 URL 中指定参数,以后可以在应用程序的其他部分检索这些参数。通过指定附加到 @ 符号的参数名称轻松地做到这一点:

Route.get('/dashboard/@user_id', 'WelcomeController@show')

可选参数

有时你希望有选择地匹配路由和路由参数。例如,你可能希望将 /dashboard/user/dashboard/user/settings 匹配到相同的控制器方法。在这种情况下,可以使用可选参数,它们只是将 @ 符号替换为 ?

Route.get('/dashboard/?option', 'WelcomeController@show')

域名

你可以指定要匹配此路由的子域。如果你只想在「docs」子域(docs.example.com)上匹配此路由:

Route.get('/dashboard/@user_id', 'WelcomeController@show').domain('docs')

路由编译器

路由编译器是一种通过特定类型匹配某个路由参数的方法。例如,如果你只关注匹配 @user_id 为整数的位置。可以通过将 : 字符和编译器名称附加到参数来执行此操作:

Route.get('/dashboard/@user_id:string', 'WelcomeController@show')

可用的路由编译器有:

  • integer
  • int (别名为 integer)
  • string
  • signed

创建路由编译器

如果你希望能够支持路由的特定正则表达式匹配,你还可以创建自己的路由编译器。

所有路由编译器都需要添加到 Kernel.py 文件中的 register_routes() 方法的顶部。

    def register_routes(self):
        Route.set_controller_locations(self.application.make("controllers.location"))
        Route.compile("handle", r"([\@\w\-=]+)")

        #..

注意:编译方法需要在此方法中加载路由之前发生,因此请确保它位于顶部。你也可以把它放在 register_routes() 方法之前的任何方法中。

路由组

路由组是将多个路由组合在一起的好方法,这些路由具有类似的选项,例如前缀,或者具有相同中间件的多个路由。

路由使用 group() 方法,该方法接受路由列表和选项的关键字参数:

ROUTES = [
  Route.group([
    Route.get('/settings', 'DashboardController@settings').name('settings'),
    Route.get('/monitor', 'DashboardController@monitor').name('monitor'),
  ],
  prefix="/dashboard",
  middleware=['web', 'cors'],
  name="dashboard."),
  domain="docs"
]

prefix 和 name 选项将为组内路由中设置的选项添加前缀。在上面的示例中,路由的名称为 dashboard.settings,其 URL 为 /dashboard/settingsdashboard.monitor 以及 URL /dashboard/monitor

路由视图

路由视图是一种快速返回视图的快捷方式,无需为了返回视图而构建控制器:

ROUTES = [
  Route.view("/url", "view.name", {"key": "value"})
]

如果需要,你也可以选择传入你希望支持的方法:

ROUTES = [
  Route.view("/url", "view.name", {"key": "value"}, method=["get", "post"])
]

列出路由信息

你可以使用 routes:list Masonite 命令列出应用程序路由。路由信息将显示在包含相关路由信息的表中,例如路由名称、方法、控制器和为此路由启用的中间件。

路由信息可以通过以下方法过滤:

python craft routes:list -M POST,PUT

你也可以按名称过滤路由:

python craft routes:list -N users

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

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

原文地址:https://learnku.com/docs/masonite/4.0/fe...

译文地址:https://learnku.com/docs/masonite/4.0/fe...

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


暂无话题~