Fecshop 架构结构

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

一:Composer包结构

1. Fecshop核心包

https://github.com/fancyecommerce/yii2_fecshop

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

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

2. Fecshop入口包

https://github.com/fancyecommerce/yii2_fecshop_app_advanced

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

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

3.其他依赖包

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

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

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

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

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

要解决fecshop升级和使用者二开的文件冲突问题。 使用者无权修改/vendor/fancyecommerce/fecshop下面的文件,只能通过配置的方式进行 重写,如果强制修改/vendor/fancyecommerce/fecshop下面的文件,升级后将会被清除。

二: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

一些第三方的类库

6.migrations

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

7.models

数据库对应的models

8.services

Fecshop 服务,是各个app端公用的service,是fecshop的底层部分

9.shell

执行的脚本部分。

10.yii

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

三:二次开发结构

1. 功能重写结构

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

安装fecshop后,在安装的根目录,您会看到各个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,可以设置不同的语言,不同的默认货币,不同的模板 ,fecshop的模板是在store中进行配置的, 打开配置文件:@appfront/config/fecshop_local_services/Store.php, 即可为每一个store设置本地模板路径,本地路径的文件会覆盖fecshop模板路径的文件, 这个是按照文件路径进行的覆盖。

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

覆盖方法:

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

如果我想重写 fecshop 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的功能。 扩展的功能。 这么不做详细叙述。