用于精简框架的生命周期

Web 应用程序的本质很简单:它接收 HTTP 请求;它调用适当的代码;它返回 HTTP 响应。精简框架通过在简单、易于使用的界面下方隐藏前期应用程序基础,让构建和启动小型的 Web 应用程序和 API 变得非常简单。但是,对于那些对底层细节感兴趣的人来说,以下是完整的精简应用程序生命周期内容。

实例化

在实例化过程中,精简框架创建 Request 对象,它会为当前 HTTP 请求提供一个简单的界面。精简框架还会创建一个 Response 对象,它默认返回 HTML 格式的 200 OK 响应;Response 对象确定返回给客户端的 HTTP 响应的状态代码、内容类型和 body。

在 Request 和 Response 对象创建后,精简框架会创建一个 Router 对象和一个 View 对象。Router 对象组织精简应用程序的路由。View 对象呈现将用作 HTTP 响应 body 的模板内容。最后,如果尚未启动 PHP 会话,精简框架会启动一个 PHP 会话。

Router 和 View 对象保持在幕后状态。Request 和 Response 对象通常会直接涉及控制器代码,并且可以通过 $app->request()$app->response() 分别从应用程序中的任意位置访问它们。

路由定义

在实例化之后,定义精简应用程序路由。路由是一个集合,其中包含 URI、控制器代码以及路由响应的一个或多个 HTTP 方法。

$app = new Slim(); $app->get('/foo', function () {
    //Controller code
});
$app->run();

此示例演示将 URI “/foo” 映射到针对 HTTP GET 请求的特定控制器代码的路由。精简应用程序实例方法 $app->get()$app->post()$app->put()$app->delete()$app->options()$app->map() 可以用来定义响应相应 HTTP 请求方法的应用程序路由。

当调用其中一个这些精简应用程序实例方法来定义路由时,Router 对象会以 Route 对象的形式关联给定的 URI 与针对给定的 HTTP 请求方法的特定控制器代码。

Router 返回的结果 Route 对象提供可链接方法(比如 $route->name()$route->conditions()$route->via()),这些方法可以在精简应用程序运行之前对 Route 对象进行更多自定义。

运行应用程序

在定义应用程序路由后,会调用 $app->run() 方法来启动 Slim 应用程序。Slim 会新建一个输出缓冲区,用于捕获 echo()d 期间的 run() 方法内容(即来自路由的控制器代码或中间件)。Slim 会在整个运行方法中通过 $app->applyHook() 在间歇挂钩处调用中间件;这些挂钩允许开发者在运行循环中的指定位置调用排队的回调。

接下来,Slim 会循环遍历与当前 HTTP 请求 URI 匹配的所有路由对象。路由器对象直接在 foreach 循环中得到使用;之所以可行,是因为路由器实现了 IteratorAggregate 接口,并在从迭代上下文中(例如 foreach 循环)中调用时返回一个 ArrayIterator 对象。

路由器会询问每个路由对象,它是否与当前 HTTP 请求 URI 相匹配。在询问后,路由对象会将其模式(例如 /hello/:first/:last)编译成正则表达式,同时考虑可选参数或参数条件。如果 HTTP 请求 URI 与结果路由正则表达式相匹配,则路由器会将路由对象附加到一个匹配的路由数组中,以便在运行循环中进行迭代。

每个路由对象都知道它响应哪些 HTTP 方法。对于每个迭代循环,如果当前路由对象响应当前 HTTP 请求方法,则 Slim 会调用路由的控制器代码。但是,如果当前路由对象不响应当前 HTTP 请求方法,则当前路由对象响应的方法将被附加到 $httpMethodsAllowed 数组中(稍后应该 Slim 返回 405 方法不允许 HTTP 响应)。

如果路由对象响应当前 HTTP 请求方法,并且在路由的控制器调用期间未抛出异常,则 Slim 会中断路由迭代循环,并将当前输出缓冲区的内容附加到响应对象的正文属性中。

如果路由与 HTTP 请求 URI 相匹配,但与 HTTP 请求方法不匹配,则 Slim 会返回 405 方法不允许 HTTP 响应以及一个允许标头,其中列出了匹配路由确实响应的 HTTP 方法。

如果没有路由与 HTTP 请求 URI 相匹配,则 Slim 会调用应用程序的未找到处理程序,并返回 404 未找到响应。未找到处理程序与路由的作用相同;它发送到输出缓冲区的内容会附加到响应对象的正文中。

在路由迭代完成且响应对象准备就绪后,Slim 会保留闪存消息,并向会话数据存储刷新 $_SESSION 数据,然后再将响应对象传递到 HTTP 客户端。