Fecshop 架构简叙
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 多模板路径优先级加载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的功能。 扩展的功能。 这么不做详细叙述。
更多建议: