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