yii2 fecshop 框架特性

框架特性:

按照程序的执行顺序,大致分为4个层次:

1.app应用入口:首先通过nginx解析到appfront,appadmin,apphtml5等app层入口index文件,然后由index.php加载各个配置传递给application,这一层做的事情是配置的收集,组合,最终生成一个大的config数据传递给yii2 application,每一个app应用的配置文件是不同的,进而后面的各个层的执行都会不一样。

2.yii2初始化层,在第一步骤的config数组传递给yii2 application,就开始了yii2的初始化层,一直到执行conroller之前,也就是在做调度之前,都是yii2的初始化层,yii2系统执行的任务,设立涉及到很多对象的初始化,有yii2系统的,也有第三方添加的bootstrap部分,其中组件,模块都是可以添加bootstrap的,这一步骤发生在执行controller之前的初始化,也就是无论执行那个controller,都必须执行的部分。(注意,这里的bootstrap指的是yii2的初始化,而不是twitter 出的css框架 bootstrap)

3.Module层:在yii2初始化完成后,执行的就是模块层,这一层,里面有controller,block,view三层结构,controller仅仅负责调度,block负责解析前台传递的数据,调用相应的组件服务,产生相应的结果,对于content部分,是由controller接收,传递到view,也有直接使用block和view生成的html部分代码,

对于controller层和view层,都不会陌生,block层是我新加入的一个层,也就是把controller中对逻辑的处理,全部放到block层来完成,block像是肌肉层,负责连接,连接前台传递的数据,调用相应的组件服务,返回数据给controller,当然block也是某个小部件的数据提供者(独立功能块)。

view接收数据,view分为3部分,layout部分和view content部分,这个是yii2本身有的,另外还有通过render函数生成的独立块,独立块由block和view文件组成,将生成的html可以通过配置的方式加到很多页面,譬如产品访问记录块,在产品页面的侧栏,分类页面的侧栏可能都要显示,那么可以做成块的方式调用即可。

这一层是加入缓存最多的一层,甚至是整页缓存(full page cache),动态数据用ajax动态异步加载。

总之,module是一个大的调度层和数据显示层,本身不涉及到复杂的数据处理,负责的数据处理都是在组件层完成,在module层是不允许访问model层的,大致的流程为:解析前端请求,到后端的组件服务层提取数据,组织数据,结果传递给view,然后画出来整个页面。

4.组件服务层:在model层之上的,就是组件服务层,这一层面提供各种服务,服务的粒子大致为描述性粒度,譬如产品加入购物车,查看购物车的产品,生 成订单,删除购物车产品等,这些功能的操作都是通过组件的一个函数直接返回,有点类似于微服务结构里面的各个服务,不过fecshop的组件服务层是有状态的,另外,该层和上面的各个层是放到一个主机上面的,因为是直接通过组件服务进行调用方法,所以不可以分割到不同的主机。通俗来讲,组件服务层提供的是 一个描述性的操作粒度,为了快速响应,根据需求,这一层可能被加入缓存功能,总之,这一层面的操作,会涉及到多个model的 操作,最终成为一个描述性粒度的功能。

在举个例子:譬如产品加入购物车,假设我们要扣除库存,那么对应着操作:

当前用户是否登录,如果登录则…

验证传递的产品参数是否存在有效(前端传递数据的有效性),然后….

将产品数据加入到cart表中…

扣除库存…

等等,上面这一系列的操作,会涉及到很多表的查询和更新插入等操作,但是我们描述的粒度为  产品加入购物车,在数据库端要执行的所有操作,都是在一个描述粒度里面,后期可能加入很多其他方面的扩展,譬如判断是否有优惠券,是否使用积分等等,都会添加到这个粒度里面,但是对访问服务组件层的module来说,是透明的,无论服务层如何更改添加新功能,module还是按照之前的方式调用(当然有可能多传递一些参数,甚至返回的数据格式有变化)。

5.Model层:数据库操作层,分为mysql和mongodb,访问数据库层,所做的事情有:数据的查找,更新和插入时的数据验证,保存,数据的删除,以及其他一部分基于数据操作的函数等,这个层面提供的功能粒度比较小,是基于表操作的粒度,module不会添加事务,事务的控制在服务层添加。由组件服务层来组织。

OK,fecshop的框架大致如此。

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注