控制器
控制器是大部分业务逻辑所在之处,也是你处理响应的地方。响应可以是字典、列表(list)、视图(view)或者其他任何可以渲染响应的类。
介绍
你可以使用 craft 命令创建新的基础控制器,或者也可以手动创建新的控制器。控制器是指带有将方法映射到路由的类。
你的路由可能像这样的:
Route.get('/', 'WelcomeController@show')
此例中,路由会调用 WelcomeController
类的 show
方法。
要通过 craft 命令创建一个基础控制器,只需运行这一命令:
$ python craft controller Welcome
此处就会快速帮你创建好一个新的控制器类。这个控制器类会像这样:
from masonite.controllers import Controller
from masonite.views import View
class WelcomeController(Controller):
def show(self, view: View):
return view.render("")
现在,你可以开始构建控制器并添加你需要的响应内容了。
请注意,该控制器继承了 Masonite 基础的
Controller
类。此处要求 Masonite 在路由中接收你的控制器类。
依赖注入
控制器中的构造方法和普通方法都由 Masonite 的服务容器反射解析。因此你可以在构造方法或者普通方法中使用类型提示引入大部分 Masonite 的类:
def __init__(self, request: Request):
self.request = request
#..
def show(self, request: Request):
return request.param('1')
查看更多关于服务容器的信息。
响应
控制器可以基于你的的实际需要返回不同类型的响应。
JSON
如果你想要返回 JSON 响应,你可以返回字典或者列表:
def show(self):
return {"key": "value"}
这将会返回 application/json
类型的响应。
字符串
你可以返回字符串:
def show(self):
return "welcome"
视图
如果你像要返回视图(View),你可以解析视图类并使用 render 方法:
def show(self, view: View):
return view.render("views.welcome")
模型
如果你使用了 Masonite ORM,你可以直接返回模型:
from app.User import User
#..
def show(self, response: Response):
return User.find(1)
重定向
如果你想要返回一个重定向,你可以解析 Response 类并使用它的 redirect 方法:
def show(self, response: Response):
return response.redirect('/home')
其他
你也可以返回任何包含 get_response()
方法的类。该方法需要返回以上其中任何一个响应类型。
请求参数
如果你的路由中有参数,你可以通过指定控制器的方法中的参数来获取它:
Route.get('/users/@user_id', 'UsersController@user')
因为 id
参数在路由之中,我们可以通过指定控制器方法中的命名参数来获取这一参数:
def show(self, user_id):
return User.find(user_id)
另一个能够获取路由参数的方法是,通过Request类:
from masonite.request import Request
def show(self, request: Request):
return User.find(request.param('user_id'))
控制器目录
Masonite 可以在注册的控制器目录中使用字符串绑定,接入控制器(继承 Controller
类)。
默认注册的控制器目录是 app/controllers
,在项目 Kernel.py
配置文件中对其进行了定义:
self.application.bind("controllers.location", "app/controllers")
# ...
Route.set_controller_locations(self.application.make("controllers.location"))
设置目录
你可以通过在 Kernel.py
文件中编辑默认绑定的 controllers.location
,重写注册的控制器目录。
添加路径
你可以使用 add_controller_locations
添加多个额外的控制器目录:
from masonite.routes import Route
Route.add_controller_locations("app/http/controllers", "other_module/controllers")
做这件事最好是在 Kernel.py
文件的 register_routes()
方法中。
注意:你应该在注册路由之前就绑定目录,否则注册路由会因为 Masonite 不能解析控制器类而失败。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。