# 如何使用控制器

控制器,负责处理路由转发过来的请求,并且返回处理的结果。

默认情况下,当你使用命令行工具,成功创建一个项目后,在项目的 lib/app/controller 文件夹,会自动创建一个名字为 HomeController,这是一个示例控制器,它的基本代码如下

import 'package:project_name/bootstrap/Context.dart';
import 'package:project_name/bootstrap/meta/RouteMeta.dart';

class HomeController {
  ('/', 'GET')
  static void index(Context ctx) async {
    ctx.html("hello world");
  }

  ('/other', 'GET')
  static void other(Context ctx) async {
    String text = ctx.getString('text');
    // some other code
    ctx.html("get som text from web : " + text);
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

非常简单的一个示例。我们来认识一下它们。

# 如何导入依赖

import 'package:project_name/bootstrap/Context.dart';
import 'package:project_name/bootstrap/meta/RouteMeta.dart';
1
2

依赖是指当前文件所需要的外部功能文件。上面的代码,导入了两个依赖,假设你的项目名为 project_name

Context.dart 文件里,定义的有 Context 类,它提供了一些接收信息的方法,以及输出信息的方法。

RouteMeta.dart 文件里,定义的有 RouteMeta 类,它是一种修饰,来提醒开发者或者程序,因该以什么请求方式,什么请求路径,才能访问它所修饰的代码快。

# 什么是控制器类和方法

class HomeController {
1

这一行告诉我们,这个文件定义了一个控制器类,名字为 HomeController。 这个名字以 Controller 为结尾,是一种约定俗成的写法。

static void index(Context ctx) async {
// ...
static void other(Context ctx) async {
1
2
3

这两行,即是定义了两个方法,名字分别是 indexother 。 其中有一些关键字,需要说明:

关键字 static 告诉我们,他们是静态方法。

也就是说,我们可以使用 HomeController.indexHomeController.other 直接使用他们。

关键字 void 告诉我们,这两个方法只是处理代码流程,并不返回信息。

关键字 async 告诉我们,这两个方法支持异步处理。

提示

staic, void, async 这三各关键字对于一个控制器的方法非常重要,千万不要忘记他们。

# 简单的请求和响应

上面的 index 方法,里面只有一行代码

ctx.html("hello world");
1

它的意思是,输出一句话 hello world 给浏览器请求。输出的内容类型是 hmtl 类型。

上面的 other,里面有三行代码

String text = ctx.getString('text');
// some other code
ctx.html("get som text from web : " + text);
1
2
3

它的意思是,接收请求参数 text, 并且再输出一句话给浏览器。

其中 ctx.getString('text') 即是接收请求参数的,

它表明接收的参数名字是 text,接收的参数类型是 String, 也就是字符串

接收请求信息,返回响应信息,相关的内容还有很多,在接下来的两节里,我们将深入认识他们。