hello,Phalcon

作者: 半亩房顶 | 来源:发表于2019-04-28 19:14 被阅读0次

目的

工作需要,学习下phalcon

特点

phalcon学习(2.0.9)

环境

这里介绍下我学习的版本、环境等
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();

总结

很棒的框架,有足够的功能组件,代码写起来感觉还是很舒服的,框架总体来说方便易用,还很灵活,赞一个,工作中继续学习,待以后分享。

以上

欢迎大家关注我的公众号


半亩房顶

相关文章

网友评论

    本文标题:hello,Phalcon

    本文链接:https://www.haomeiwen.com/subject/fzvjnqtx.html