Fecmall 架构结构

这里说明的是fecmall的文件结构,执行流程等知识。

一:总览

Fecmall在MVC三层架构上,加入了block层和services层,方便扩展和后期重构底层

入口文件:终端用户能直接访问的 PHP 脚本, 负责启动一个请求处理周期,譬如:@app/web/index.php

系统初始化bootstrap:指的是系统的初始化过程中执行的部分,譬如store语言,货币等, 都是在初始化过程中执行。

模块:yii2框架中的模块部分

controller:控制器,一个controller里面有多个action方法,每个action请求,一般对应 一个block,用来处理该action下面的逻辑

block: 逻辑处理层,负责处request发送的数据,调用相应的services方法,然后 进行处理返回最终数据,一般一个controller中的一个action,对应一个block文件

services:服务层,该层为fecmall的核心部分,很多的逻辑都是在此处实现, 对于某个功能,譬如购物车部分,您可以实现多个services,然后通过配置的方式进行切换, 譬如官方实现的redis cart,可以替代mysql cart,因此该层的加入,让您可以方便的重构底层, 根据业务的需求,开发不同的services,甚至使用远程的api封装成services, 让底层的重构更加容易,同时该结构扩展性强,应用市场可以开发不同的services应用插件, 让用户可以方便的安装应用直接切换其他的services

另外该层为共用层,pc,wap,vue,微信小程序,都公用services层

fecmall大多数的逻辑实现以及业务处理,都是在services层进行的。

models:数据库层

view:视图渲染层view

二:Composer包结构

1. Fecmall核心包

https://github.com/fancyecommerce/yii2_fecshop

这个是FecMall的核心包,里面包含 入口系统(appfront Appadmin等) ,以及对应的模块配置,还包含扩展的yii2 component, 重写的yii2的类,以及fecshop services(服务),model,shell(命令行), migrations(数据库安装)等等。

这个包类似yiisoft/yii2,将fecmall核心代码以扩展的方式制作, 是为了解决fecmall升级和yii2二次开发者重新扩展fecmall的冲突

安装后,该包的文件路径为:vendor/fancyecommerce/fecshop

2. Fecmall入口包

https://github.com/fancyecommerce/yii2_fecshop_app_advanced

这个是fecmall的web入口包,里面有 appadmin/web,appfront/web, 以及图片web的路径,nginx解析到这些路径,就可以进行访问了 ,入口文件index.php就在这个包中,index.php中加载fecshop核心代码的配置.

这个包类似 https://github.com/yiisoft/yii2-app-advanced, 起到一个web访问路径,加载fecmall核心代码的作用, 安装这个包后,fecmall核心包,会以扩展依赖的方式被加载过来,同样yii2的核心库 也是这样。

3.其他依赖包

其他的不一一列举,这个安装后在vendor文件夹下面可以查看, 这里面有两个我开发的扩展

DWZ(JUI)和yii2整合的后台扩展: https://github.com/fancyecommerce/yii2_fec_admin

基础封装扩展: https://github.com/fancyecommerce/yii2-fec

4.为什么把Fecmall的核心代码做成扩展包的方式?

对这个有疑问的朋友也比较多,为什么要做成扩展包,原因:

要解决Fecmall升级和使用者二开的文件冲突问题,为了方便升级, 使用者无权修改/vendor/fancyecommerce/fecshop下面的文件,只能通过配置的方式进行 重写,如果强制修改/vendor/fancyecommerce/fecshop下面的文件,升级后将会被清除, 因此,fecmall做成composer包非常合适,通过composer进行升级解决文件包依赖问题, 开发者的开发文件和fecmall的源文件,以及应用插件进行隔离, 不影响相互升级。

二:FecShop核心包文件结构

打开vendor/fancyecommerce/fecshop ,这里就是fecshop的核心代码包。

1.app 文件夹

@fecshop/app里面 是各个入口系统的文件代码,包含 @fecshop/app/appadmin,@fecshop/app/appfront等。

1.1@fecshop/app/appfront

这里是前端pc代码,打开@fecshop/app/appfront,可以看到如下文件夹:

@fecshop/app/appfront/config    		#appfront的配置代码部分
@fecshop/app/appfront/helper			#appfront的各个模块的公用helper类
@fecshop/app/appfront/languages			#appfront的语言翻译包部分
@fecshop/app/appfront/modules			#appfront的模块部分
@fecshop/app/appfront/theme				#appfront的模板theme部分
@fecshop/app/appfront/widgets			#appfront的小部件数据提供部分,这里的小部件是一个展示块,譬如页面的顶部,底部,侧栏显示产品浏览记录等等,就是显示的一个区块。

1.1.1 @fecshop/app/appfront/modules

此文件夹下面的各个文件夹都是一个模块,下面是详细说明

@fecshop/app/appfront/config							#模块的配置文件夹
@fecshop/app/appfront/modules/AppfrontController.php	#是各个模块中controller的基类。
@fecshop/app/appfront/modules/AppfrontModule.php		#是各个模块的Module.php的基类。

进入catalog 这个模块,你会看到

@fecshop/app/appfront/modules/catalog/block			# 模块的中间逻辑层
@fecshop/app/appfront/modules/catalog/controllers	# 模块的控制层文件
@fecshop/app/appfront/modules/catalog/helpers		# 模块的帮助类文件
@fecshop/app/appfront/modules/catalog/Module.php  	# 模块的入口文件,也就是在配置文件中指定该文件。

需要说明的是block是fecshop新加的一个层, 按照MVC逻辑,model的数据返回给controller中,这会造成controller 非常的膨大,因此,新加层后,fecshop的数据传递过程为:

用户访问-->fecshop初始化--->controller--->block--->services--->model

model从数据库得到数据,然后返回数据:

model--->services--->block--->controller--->view-->反馈给用户html

很多的数据的中间逻辑处理,都是在block层完成。

controller只负责调度,这样层次比较分明,参看详细代码,您应该就会看明白详细。 譬如:

fecshop\app\appfront\modules\Catalog\controllers\ProductController中的方法:

public function actionIndex()
{
	$data = $this->getBlock()->getLastData();
	return $this->render($this->action->id,$data);
}

$this->getBlock() 返回的是 fecshop\app\appfront\modules\Catalog\block\product\Index.php对应的对象, 执行Index对象的getLastData()方法,返回给$data数组,然后,render函数将 数据传递给view层。

加入block层除了文件结构的层次分明,还会更好的重用函数,精简代码。

1.1.2@fecshop/app/appfront/theme

这里是fecshop的模板部分,fecshop是在yii2基础上进行了二次修改封装, 使用的是多模板系统,关于fecshop多模板,你可以看我的博文:

yii2 fecshop 多模板的介绍

yii2 多模板路径优先级加载view方式下- js和css 的解决

2.@fecshop/components

这是fecshop扩展的component(yii2 组件),这里只有一个store.php,这个概念属于yii2的知识

3.@fecshop/config

各个app,譬如appfront appadmin公用的配置部分,里面大多数的配置是对services的配置, 以及组件配置。

4.@fecshop/interfaces

公用接口部分

5.lib

一些第三方的类库文件(不基于composer的库包,不支持namespace的一些老库包)

6.migrations

这个是在安装fecshop对应的数据库部分,执行后,您的本地将会安装 数据库表,索引,以及数据。

7.models

数据库对应的models,fecmall的所有的models都放到该文件夹下面

8.services

Fecshop 服务,是各个app端公用的service,是fecshop的底层部分,fecmall的业务处理逻辑 基本都在这里实现。

9.shell

执行的脚本部分,命令行处理一写业务数据,包括手动执行和cron执行的命令行。

10.yii

重写的yii2的文件存放的路径。

三:二次开发结构

1. 功能重写结构

功能重写:要满足在不修改源文件代码的前期下修改FecMall的功能, 这样才能满足fecmall的升级。

安装 fecmall 后,在安装的根目录,您会看到各个app开头文件夹,譬如appadmin,appfront,apphtml5, appapi,appserver等, 这个部分是属于二次开发用户的,您可以在里面添加配置,添加文件等等,进行二次开发操作, 譬如在/appfront这个入口举例:

1.1重写语言,您在@appfront/languages 路径的相应语言,填写配置项,即可

重写原来fecshop预设的翻译,譬如

@appfront/languages/zh-CN/appfront.php中添加配置

<?php
return [
 'Follow Us' => '关注我们',
];

即可覆盖fecshop的翻译

@fecshop/app/appfront/languages/zh-CN/appfront.php 中的Follow Us翻译。

1.2重写theme

不同的store,可以设置不同的语言,不同的默认货币,不同的模板 ,fecmall的模板是在store中进行配置的, 打开配置文件:@appfront/config/fecshop_local_services/Store.php, 即可为每一个store设置本地模板路径,本地路径的文件会覆盖fecshop模板路径的文件, 这个是按照文件路径进行的覆盖。

store:fecshop.appfront.fancyecommerce.com/fr 设置的localThemeDir@appfront/theme/terry/theme01 .

覆盖方法:

fecmall的appfront模板路径为:@fecshop/app/appfront/theme/base/front

如果我想重写 fecmall appfront 模板路径里面的 catalog/product/index.php ,那么我在本地模板路径 @appfront/theme/terry/theme01 下面新建文件 @appfront/theme/terry/theme01/catalog/product/index.php,即可完成重写覆盖。

1.3 重写模块

这个是Yii2的知识。您在@appfront/config/fecshop_local_modules下面添加一个配置文件 ,重新设置class指向的地址,就可以完全重写这个模块了

1.4 重写yii2 component

这个是yii2的知识,添加配置覆盖class即可

1.5 重写Yii2 services

您在@appfront/config/fecshop_local_services下面添加一个配置文件,覆盖class即可 ,譬如重写fecshop product服务,新建文件@appfront/config/fecshop_local_services/Product.php ,填写内容:

return [
	'product' => [
		'class' => 'fecshop\services\Product',
	],
]

将里面的class对应的路径,换成您自己的路径即可,然后新建您配置的路径文件, 继承fecshop\services\Product,如果重新里面的方法即可。

1.6 任意重写

您可以通过classMap的方式,实现任意重写, 这种方式适合对单个文件进行重写,无论是yii2的文件,还是fecshop,还是第三方开发 的,都同样适合,您可以在 @appfront/config/YiiClassMap.php里面添加对应关系, 具体的实现思路和原理参看我的博文: 通过配置的方式重写某个Yii2 文件 或第三方扩展文件

1.7

总之,您可以在不修改vendor下面的任何文件的前提下(yii2 和 fecshop核心代码),在appfront路径下面,你可以二开属于自己的功能,和重写fecshop,yii2的功能。 扩展的功能。 这么不做详细叙述。