流程清单
phalcon树形清单如下:
- 初始化DI (config/services.php)
$di = new FactoryDefault();
- 设置路由
$di['router'] = function () {}
- 设置URL
$di['url'] = function () {}
- 设置Session
$di['session'] = function () {}
- 设置路由
- 初始化Application (public/index.php)
- 实例化App
$application = new Application();
- 注入DI
$application->setDI($di);
- 注册模块(config/modules.php)
$application->registerModules()
- 实例化App
- 启动Application (ext/mvc/application.c)
$application->handle()
- 检查DI
- E触发事件
application:boot
- 路由启动
$di['router']->handle()
- 获得模块名
$moduleName = $di['router']->getModuleName()
,如果没有则从$application->getDefaultModule
获取 - 模块启动(如果路由命中)
- E触发事件
application:beforeStartModule
- 调用模块初始化方法(Module.php)
registerAutoloaders()
以及registerServices()
- E触发事件
application:afterStartModule
- E触发事件
- 分发
- 初始化View
- 初始化Dispatcher,将Router中的参数复制到Dispatcher
- 调用View
View->start()
开启缓冲区 - E触发事件
application:beforeHandleRequest
- 开始分发(etc/dispatcher.c)
Dispatcher->dispatch()
- E触发事件
dispatch:beforeDispatchLoop
- 循环开始单次分发
- E触发事件
dispatch:beforeDispatch
- 根据Dispatcher携带的Module、Namespace、Controller、Action获得完整的类与方法名,如果找不到则触发事件E
dispatch:beforeException
- E触发事件
dispatch:beforeExecuteRoute
- 调用
Controller->beforeExecuteRoute()
- 调用
Controller->initialize()
- E触发事件
dispatch:afterInitialize
- 调用Action方法
- E触发事件
dispatch:afterExecuteRoute
- E触发事件
dispatch:afterDispatch
- E触发事件
- Action内如果有forward(),开始下一次分发
- E触发事件
- E全部分发结束,触发事件
dispatch:afterDispatchLoop
- Application获得分发后的输出
$dispatcher->getReturnedValue()
- E触发事件
application:afterHandleRequest
分发结束
- 渲染,Appliction如果从分发拿到
Phalcon\Http\ResponseInterface
类型的返回,则渲染直接结束- E触发事件
application:viewRender
分发结束 - 调用
Phalcon\Mvc\View->render()
,入口参数为Dispatcher的ControllerName / ActionName / Params - 调用
Phalcon\Mvc\View->finish()
结束缓冲区的接收
- E触发事件
- 准备响应
- 将
Phalcon\Mvc\View->getContent()
通过Phalcon\Http\Response->setContent()
放入Response - E触发事件
application:beforeSendResponse
- 调用
Phalcon\Http\Response->sendHeaders()
发送头部 - 调用
Phalcon\Http\Response->sendCookies()
发送Cookie - 将准备好的响应作为
$application->handle()
的返回值返回
- 将
- 发送响应
echo $application->handle()->getContent();