目的
工作需要,学习下phalcon
特点
- C语言编写的PHP拓展形式的框架,与yaf很像,但是yaf自带组件更少,速度快,性能高
- 文件结构灵活,松散耦合,可以自定义路由设置。
可以用注册路由 router 和 派遣器 dispatcher玩这种骚操作 - 优秀的DI机制
- phalcon过滤和清理
- phalcon拦截器
环境
这里介绍下我学习的版本、环境等
php 5.6
nginx 1.14.2
phalcon 2.0.9
IDE phpstorm(记得安装phalcon-devtools)
只能说,历史原因
启动流程
入口文件index.php
引用application。use Phalcon\Mvc\Application;
加载config(include)
DI注册阶段
引用服务。require __DIR__ . '/../config/services.php';
新建项目。$application = new Application($di);
模块注册阶段
require __DIR__ . '/../config/modules.php';
MVC流程
$application->handle()
是整个框架MVC的核心,这个函数负责处理模块、控制器、分发等MVC的流程。具体的执行流程如下:
基础检查阶段:
首先检查依赖对象服务DI是否注册,如果没有注册DI则抛出异常
A dependency injection object is required to access internal services
事件启动:
从DI启动eventsManager,并通过eventsManager管理器触发application:boot事件。
路由处理阶段:
从DI服务获得router(路由)服务,把uri传入路由并调用handle()方法。
handle()方法负责根据uri配置把请求转换到对应的Module、Controller、Action等。这一阶段会检查是否命中模块,并通过router->getModuleName()
获得模块名称。
如果模块存在,则进入模块启动阶段,如果模块不存在则直接进入路由分发阶段。可见路由的启动是先于模块的启动的。
模块启动:
在模块启动时会先调用application:beforeStartModule方法,根据modules.php的配置检查模块的正确性、名称、路径是否存在等,并把模块引导文件引进来。把模块内的action、service注册为自动加载。
moduleObject->registerAutoloaders(dependencyInjector);
moduleObject->registerServices(dependencyInjector);
registerAutoloaders()用于注册模块内的命名空间实现自动加载;registerServices ()用于注册模块内服务。
路由dispatcher分发阶段:
分发阶段由Phalcon\Mvc\Dispatcher
(分发器)来完成,分发器跟进路由命中的结果调用相应的controller/action
,最终获得action返回的结果。
在分发前会准备view,理论上MVC流程中view是最后一环节,但是分发过程中出现任何问题都需要显示出来,因此view层必须在这个环节提前启动。
分发需要dispatcher服务,可以从DI服务获得,dispatcher根据router传过来的参数设置模块名称、命名空间、控制器、动作、参数,分发启动开始前会调用view->start()
启动缓存,分发过程中所有输出都会被暂存到缓冲区。
分发时会先调用application:beforeHandleRequest方法检查dispatcher是否已经注册,然后调用dispatcher->dispatch()
进行分发作业。
业务处理
View渲染阶段
(1)分发结束后通过Phalcon\Mvc\Dispatcher->getReturnedValue()
取得分发过程返回的结果并进行处理。
(2)Render过程结束后,调用Phalcon\Mvc\View->finish()
刷新缓冲区数据。
(3)接下来从DI获取response服务,将Phalcon\Mvc\View->getContent()
获得的内容置入response。
返回响应
通过前面的流程,最终会返回一个响应给前台。此时会触发application:beforeSendResponse,并调用
Phalcon\Http\Response->sendHeaders()
Phalcon\Http\Response->sendCookies()
将http的头部信息先行发送。至此,Application->handle()
对于请求的处理过程全部结束,对外返回一个Phalcon\Http\Response
响应。
发送响应
HTTP头部发送后一般把响应的内容也发送出去:
echo $application->handle()->getContent();
总结
很棒的框架,有足够的功能组件,代码写起来感觉还是很舒服的,框架总体来说方便易用,还很灵活,赞一个,工作中继续学习,待以后分享。
以上
欢迎大家关注我的公众号
半亩房顶
网友评论