zer0-framework / http
Requires
- php: >=7.2
- zer0-framework/config: *
- zer0-framework/core: *
README
控制器
控制器位于 \*\Controllers\
目录(继承自 \Zer0\HTTP\AbstractController
)。要创建控制器,只需创建一个包含一个或多个公共方法 *Action
的类,并在 conf/Routes 中添加指向它的路径。
在执行任何 *Action
之前,将调用 before()
,之后调用 after()
,通常在这些方法中执行通用操作,如检查用户授权。
*Action
方法可以返回 \Zer0\HTTP\Responses\*
实例,如果返回值不为 null,则将其以 JSON 格式输出(\Zer0\HTTP\Responses\JSON
)。此行为可以在控制器的 renderResponse()
方法中重写。
配置路由
格式如下
getting_started:
path: /getting-started/{action}
defaults: {controller: GettingStarted, action: intro}
methods: [GET, POST]
export: [JS]
...
- path — 该路由的路径,允许在花括号中使用参数(变量)。
- path_export — 可选路径,在构建 URL 时将代替 path。在使用 CDN 时很有用。
- defaults — 可选默认值集。
- methods — 可选允许的方法列表。
- export — 可选的列表,表示将路由导出到哪里。
- sort — 可选参数,用于排序,默认为 0。值越小,执行越早。
如果没有指定 action,则默认为 index。Controller 必须指定,以便可以执行请求。
\Zer0\HTTP
类($this->http
)有方法
public function url(string $routeName, $params = [], array $query = []): string
允许构建 URL,例如:$this->http->url('getting_started', 'routes', ['foo' => 'bar']);
如上例配置路由 getting_started
,则结果为 /getting-started/routes?foo=bar
还可以使用类似的功能在 JavaScript 中使用 — Routes.url()
。此时,只能使用具有 export 列表中包含 JS 的路由。
不建议在代码中硬编码 URL。
注意! 请注意,在修改路由配置后,必须执行 cli http build-all
(make build-backend
)。
常见问题解答
为什么路由在 Nginx 中执行?
这种方法具有以下优点
- 路由数量不会影响性能,因为 Nginx 不是像 PHP 编写的请求路由器那样逐个遍历路由列表,而是使用 Btree+ 索引来定位锚定部分的 location',以 O(log n) 的复杂度找到合适的 location。
- 可以将不同的路由指向不同的 PHP-FPM 池,并且添加例如 limit_req 这样的功能并不困难。
- 甚至不需要读取和存储 PHP 部分的路由配置。